设计模式----State(状态)模式
2007-06-13 19:14
591 查看
设计模式----State(状态)模式
GoF:允许一个对象在其内部状态改变时,改变他的行为。对象看起来似乎修改了它的类。
在实际的程序开发中,我们经常会用到大量的if elseif else对某种状态进行切换,特别是用惯了结构化语言(C语言)的人。如果状态切换的情况反复出现,我们就可以考虑到采用State模式来代替程序中大量的if elseif else了。在大多数情况下,如果对象的属性不同那么相应得对象的行为要求也不同。对GoF给出的定义做个通俗的解释就是:一个对象在不同的状态下有不同的行为,也可以说对象的每个状态有着不同的行为。
下面给出事例代码(我的这个事例比较简单,但是能反映出State模式的意思):
下面是UML图:
小结:
State模式和Strategy模式非常的相像,如果不仔细追究,差别不是很大。如果用不好的话很容易将State模式退化成Strategy模式。
先来一个状态:
package State;
public abstract class State
......{
/** *//** *//** *//** Creates a new instance of State */
public State() ......{
}
public abstract void opration();
}//end class State
在来两个具体的State:
package State;
public class ConcreteStateA extends State
......{
/** *//** *//** *//** Creates a new instance of ConcreteStateA */
public ConcreteStateA() ......{
}
public void opration()
......{
System.out.println("The Concrete A");
}//end opration()
public static ConcreteStateA getInstance()
......{
return new ConcreteStateA();
}//end getInstance()
}
package State;
public class ConcreteStateB extends State
......{
/** *//** *//** *//** Creates a new instance of ConcreteStateB */
public ConcreteStateB() ......{
}
public void opration()
......{
System.out.println("The Concrete B");
}//end operation()
public static ConcreteStateB getInstance()
......{
return new ConcreteStateB();
}//end getInstance()
}//end class ConcreteStateB
来一个场景:
package State;
public class Context
......{
private State state;
/** *//** *//** *//** Creates a new instance of Context */
public Context() ......{
}
public void setSate(State stat)
......{
state = stat;
}//end setState(...)
public void operation()
......{
state.opration();
}//end operation()
}//end class Context
怎样调用:
package State;
public class StatePattern
......{
State csa;
Context con = new Context();
/** *//** *//** *//** Creates a new instance of StatePattern */
public StatePattern()
......{
csa = ConcreteStateA.getInstance();
}
public void showStatePattern()
......{
con.setSate(csa);
con.operation();
csa = ConcreteStateB.getInstance();
con.setSate(csa);
con.operation();
}//end showStatePattern()
public static void main(String[] args)
......{
StringBuilder ssb = new StringBuilder();
ssb.append("The state pattern!");
System.out.println(ssb.toString());
StatePattern sp = new StatePattern();
sp.showStatePattern();
}//end main(...)
}//end class StatePattern
GoF:允许一个对象在其内部状态改变时,改变他的行为。对象看起来似乎修改了它的类。
在实际的程序开发中,我们经常会用到大量的if elseif else对某种状态进行切换,特别是用惯了结构化语言(C语言)的人。如果状态切换的情况反复出现,我们就可以考虑到采用State模式来代替程序中大量的if elseif else了。在大多数情况下,如果对象的属性不同那么相应得对象的行为要求也不同。对GoF给出的定义做个通俗的解释就是:一个对象在不同的状态下有不同的行为,也可以说对象的每个状态有着不同的行为。
下面给出事例代码(我的这个事例比较简单,但是能反映出State模式的意思):
下面是UML图:
小结:
State模式和Strategy模式非常的相像,如果不仔细追究,差别不是很大。如果用不好的话很容易将State模式退化成Strategy模式。
先来一个状态:
package State;
public abstract class State
......{
/** *//** *//** *//** Creates a new instance of State */
public State() ......{
}
public abstract void opration();
}//end class State
在来两个具体的State:
package State;
public class ConcreteStateA extends State
......{
/** *//** *//** *//** Creates a new instance of ConcreteStateA */
public ConcreteStateA() ......{
}
public void opration()
......{
System.out.println("The Concrete A");
}//end opration()
public static ConcreteStateA getInstance()
......{
return new ConcreteStateA();
}//end getInstance()
}
package State;
public class ConcreteStateB extends State
......{
/** *//** *//** *//** Creates a new instance of ConcreteStateB */
public ConcreteStateB() ......{
}
public void opration()
......{
System.out.println("The Concrete B");
}//end operation()
public static ConcreteStateB getInstance()
......{
return new ConcreteStateB();
}//end getInstance()
}//end class ConcreteStateB
来一个场景:
package State;
public class Context
......{
private State state;
/** *//** *//** *//** Creates a new instance of Context */
public Context() ......{
}
public void setSate(State stat)
......{
state = stat;
}//end setState(...)
public void operation()
......{
state.opration();
}//end operation()
}//end class Context
怎样调用:
package State;
public class StatePattern
......{
State csa;
Context con = new Context();
/** *//** *//** *//** Creates a new instance of StatePattern */
public StatePattern()
......{
csa = ConcreteStateA.getInstance();
}
public void showStatePattern()
......{
con.setSate(csa);
con.operation();
csa = ConcreteStateB.getInstance();
con.setSate(csa);
con.operation();
}//end showStatePattern()
public static void main(String[] args)
......{
StringBuilder ssb = new StringBuilder();
ssb.append("The state pattern!");
System.out.println(ssb.toString());
StatePattern sp = new StatePattern();
sp.showStatePattern();
}//end main(...)
}//end class StatePattern
相关文章推荐
- 设计模式二十二:state(状态模式)——对象行为型模式
- 设计模式之状态模式(State)
- 设计模式之美:State(状态)
- 《模式——工程化实现及扩展》(设计模式C# 版)《状态模式 State》——“自我检验" 参考答案
- State状态设计模式
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式C++学习笔记之十九(State状态模式)
- 【JAVA】设计模式之状态模式(State模式)的使用分析
- 设计模式 (十六)状态模式(State)
- 设计模式实现(十二)--- 状态模式(State)
- 设计模式:状态模式(State)
- java设计模式:状态模式 State
- 设计模式-状态模式-state-python
- Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
- 设计模式(3)- 状态设计模式State
- 实战设计模式系列-State(状态)
- 设计模式19---设计模式之状态模式(State)(行为型)
- 设计模式——状态模式(State)
- 浅谈JAVA设计模式之——状态模式(State)