设计模式3—State设计模式
来源:互联网 发布:去小公司写php怎么样 编辑:程序博客网 时间:2024/06/02 19:19
State状态设计模式类似于Switch多路分支功能的开关,State状态模式机制如下:
状态模式UML图如下:
State状态设计模式用于改变对象的行为,在代理的生命周期里,随着状态变化从一个目标实现程序切换到另一个目标实现程序。
我们经常遇到如下的程序代码:
public class Creature {
private Boolean isFrog = true;//标识
public void greet(){
if(isFrog){
System.out.println("Ribbet!");
}else{
System.out.println("Darling!");
}
}
//转换标识
public void kiss(){
isFrog = false;
}
public static void main(String[] args){
Creature creature = new Creature();
creature.greet();
creature.kiss();
creature.greet();
}
}
上面例子代码中greet()方法在执行具体操作之前必须要判断一下标识,代码显得笨拙繁琐,使用简单State状态模式改写上面代码如下:
public class Creature{
//状态接口
private interface State{
String response();
}
private Class Forg implements State{
public String response(){
return "Ribbet!";
}
}
private class Prince implements State{
public String response(){
return "Darling!");
}
}
private State state = new Forg();
public void greet(){
System.out.println(state.response);
}
public void kiss() {
state = new Prince();
}
public static void main(String[] args){
Creature creature = new Creature();
creature.greet();
creature.kiss();
creature.greet();
}
}
State状态设计模式中,状态自动切换并传播,不需要再改动标识,代码显得非常优雅。
State状态设计模式一个基本框架如下:
//状态接口
interface State{
void operation1();
void operation2();
void operation3();
}
//状态实现类1
class implementation1 implements State{
public void operation1(){
System.out.println("Imlementation1.operation1()");
}
public void operation2(){
System.out.println("Implementation1.operation2()");
}
public void operation3(){
System.out.println("Implementation1.operation3()");
}
}
//状态实现类2
class implementation2 implements State{
public void operation1(){
System.out.println("Implementation2.operation1()");
}
public void operation2(){
System.out.println("Implementation2.operation2()");
}
public void operation3(){
System.out.println("Implementation2.operation3()");
}
}
//服务提供者
Class ServiceProvider{
private State state;
public ServiceProvider(State state){
this.sate = state;
}
//状态更改
public void changeState(State newState){
state = newState;
}
public void service1(){
//...
state.operation1();
//...
state.operation3();
}
public void service2(){
//...
state.operation1();
//...
state.operation2();
}
publc void service3(){
//...
state.operation3();
//...
state.operation2();
}
}
public class StateDemo{
private ServiceProvider sp = new ServiceProvider(new Implementation1());
private void run(ServiceProvider sp){
sp.service1();
sp.service2();
sp.service3();
}
public static void main(String[] args){
StateDemo demo = new StateDemo();
demo.run(sp);
sp.changeState(new Implementation2());
demo.run(sp);
}
}
State状态模式和Proxy代理模式都为客户端提供了一个目标程序代理,真正的目标程序被代理所隐藏,当客户端程序调用目标程序时,首先将调用请求发送给代理,代理才真正调用目标程序,但是Proxy代理模式和State状态模式有如下区别:
(1)Proxy代理模式中被调用的目标程序只有一个,而State状态模式中被调用的目标程序有多个。
(2)Proxy代理模式的目的是控制客户端对目标程序的访问,而State状态模式是为了根据条件动态改变目标程序。
- 设计模式3—State设计模式
- 设计模式—State模式
- 设计模式:State模式
- 设计模式--State 模式
- 设计模式(3)- 状态设计模式State
- 设计模式3——State设计模式
- 设计模式3——State设计模式
- 设计模式——状态模式(State)
- JAVA设计模式—状态模式(State)
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式小议:state
- 设计模式之State
- 设计模式之State
- State设计模式
- 设计模式之State
- 设计模式之State
- 希尔排序-c++
- hibernate中criteria的用法
- Core Data入门
- 第156天
- 把Storyboard减轻的方法
- 设计模式3—State设计模式
- Linux系统的磁盘管理及分区应用
- OC类
- IOS成长中 C语言之进制
- crm使用soap删除字段
- ASP.NET Web API 管道模型
- halcon学习备忘五(图像选择,剪切,obj循环,ocr识别)
- Java 中堆栈的理解
- HDOJ 题目2036 改革春风吹满地(数学,几何,水题)