java设计模式之状态模式
一、解释说明
状态模式就是把对象与行为的对应关系抽象成模板,容器只聚合此模板,就可以根据状态来控制所有的行为。
二、案例代码
用例图
1、状态与行为抽象成的模板,代码如下
package 设计模式.状态模式;
/**
* 状态与行为的抽象模板
*/
public interface State {
//状态对应的行为方法
public void doSomething();
}
2、愉快状态的行为类,代码如下
package 设计模式.状态模式;
//愉快状态时候的行为
public class HappyState implements State {
@Override
public void doSomething() {
System.out.println("去唱歌、泡妞");
}
}
3、生气状态的行为类,代码如下
package 设计模式.状态模式;
//生气时候对应的行为
public class AngryState implements State{
@Override
public void doSomething() {
System.out.println("去喷人、睡觉、捶墙");
}
}
4、小克马容器类,代码如下
package 设计模式.状态模式;
//小克马(人),可以根据传入的状态来控制行为
public class Xkm {
//把模板聚合进来,就可以掌握一切了
private State state;
//传入状态,这样传入的话,便于扩展
public void setState(State state){
this.state = state;
this.state.doSomething();
}
}
5、客户端调用类,代码如下
package 设计模式.状态模式;
public class Client {
public static void main(String[] args) {
//拿到小克马这个容器
Xkm xkm = new Xkm();
//把生气状态给小克马这个容器,就可以调用改状态下对应的行为了
xkm.setState(new AngryState());
//把高兴状态给小克马这个容器,就可以调用改状态下对应的行为了
xkm.setState(new HappyState());
//这样的话,到时候可以修改每个状态的行为,而不会影响主类;而且可以添加无数个状态
}
}
三、适用场景
1、行为随状态改变而改变的的场景,例如权限设计,人员对象权限不同执行相同的行为其结果也会不同。
2、条件、分支判断语句替代者,通过扩展子类实现条件判断处理。
四、优缺点
1、优点
●1)结构清晰,避免了程序的复杂,提高了系统可维护性。
●2)遵循了设计原则。很要的体现了开闭原则和单一职责原则,每个状态都是一个子类,与单一职责原则高度符合,扩展状态只需增加子类,正是开闭原则的体现。封装性与迪米特法则也非常吻合。
2、缺点
如果一个事务有很多个状态,就会造成子类太多的问题。需要在项目使用时来衡量是否使用状态模式。
还没有评论,来说两句吧...