java设计模式----状态模式
2016-02-26 10:40
525 查看
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。
策略模式和状态模式有点相似,区别就是状态模式是行为改变状态,主要在于状态改变行为的应用场景,而策略模式则是采用哪种算法,让Context去实现哪种算法,决定权在于客户端。[b]状态模式的行为是平行的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的。[/b]
主要有三个角色:
环境角色(Context):保留客户端所需要的一些接口,并保留一个具体状态类的实例。
抽象状态角色(State):作为一个接口,封装环境对象的一个特定的状态所对应的行为。
具体状态角色(ConcreteState):实现具体的接口定义行为。
测试
结果
策略模式和状态模式有点相似,区别就是状态模式是行为改变状态,主要在于状态改变行为的应用场景,而策略模式则是采用哪种算法,让Context去实现哪种算法,决定权在于客户端。[b]状态模式的行为是平行的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的。[/b]
主要有三个角色:
环境角色(Context):保留客户端所需要的一些接口,并保留一个具体状态类的实例。
package design.state; public class Context { private State state; public void setState(State state) { this.state = state; } //定义客户端调用接口 public void request(String para){ state.handle(para); } }
抽象状态角色(State):作为一个接口,封装环境对象的一个特定的状态所对应的行为。
package design.state; public interface State { public void handle(String para); }
具体状态角色(ConcreteState):实现具体的接口定义行为。
package design.state; public class ConcreteStateA implements State{ @Override public void handle(String para) { System.out.println("ConcreteStateA handle:"+para); } }
package design.state; public class ConcreteStateB implements State{ @Override public void handle(String para) { System.out.println("ConcreteStateB handle:"+para); } }
测试
package design.state; public class Client { public static void main(String[] args) { //创建状态 State state=new ConcreteStateA(); State state1=new ConcreteStateB(); //创建环境 Context context=new Context(); //设置状态 context.setState(state); //请求 context.request("test"); //设置状态 context.setState(state1); //请求 context.request("test"); } }
结果
ConcreteStateA handle:test ConcreteStateB handle:test
相关文章推荐
- 40个Java多线程问题总结
- myeclipse调试程序
- java中文转码
- Java 资源链接
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- ndk环境搭建(Eclipse)
- 处理Java异常三原则(必备)
- myeclipse优化
- Junit对Spring Controller进行单元测试
- Java中Return和Finally运行顺序的实现
- lunix安装jdk(rpm格式)
- java,for穷举,99乘法表
- 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools:
- Java Garbage Collection Basics--转载
- java中get请求的中文乱码问题
- 调用支付宝时报这 java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
- 如何在Jmeter中使用外部的java文件
- Java 中final修饰符总结
- 关于 eclipse启动卡死的问题处理
- java设计模式——单例模式