首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式之 State - 状态模式

2012-09-03 
设计模式之 State - 状态模式State模式也叫状态模式,是由GoF提出的23种软件设计模式的一种。State模式允许

设计模式之 State - 状态模式
State模式也叫状态模式,是由GoF提出的23种软件设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
本文介绍设计模式中的(State)模式的概念,用法,以及实际应用中怎么样使用State模式进行开发。



State模式的角色:
State
????对状态和状态行为的抽象。比如上面的例子,可以把每个画图工具看作状态的保持者。
ConcreteState
????各种状态的具体实现。比如画线工具,擦除工具等。
StateWrapper
????状态的外部封装类,或者说状态的容器类。它包含了对当前状态的引用。可以根据不同状态执行不同的行为。


State模式的应用范例
我们使用State模式来实现选择画笔工具进行画图的操作。

文件一览:
Client
????测试类。
AbstractTool
????相当于State角色。各种状态的抽象类。
LinePenTool
????相当于ConcreteState角色。画线工具类。
EraseTool
????相当于ConcreteState角色。图像擦除类。
ToolkitsPannel
????相当于StateWrapper角色。使用currentTool保持状态。可以通过selectTool方法改变其状态。

代码:
public class Client {
????/**
???? * Test State Pattern
???? *
???? */
????public static void main(String[] args) {
????????//创建工具面板
????????ToolkitsPannel pannel = new ToolkitsPannel();
????????
????????//往工具面板上添加各种工具
????????AbstractTool tool1 = new LinePenTool();
????????pannel.addTool("LinePenTool", tool1);
????????
????????AbstractTool tool2 = new EraseTool();
????????pannel.addTool("EraseTool", tool2);
????????
????????
????????//选择LinePenTool工具(改变状态)
????????pannel.selectTool("LinePenTool");
????????pannel.drawOrExecute();
????????
????????//选择EraseTool工具(改变状态)
????????pannel.selectTool("EraseTool");
????????pannel.drawOrExecute();
????}
}

/**
* State & subclass
*
*/
abstract class AbstractTool {
????public abstract void drawOrExecute();
}

//State'subclass
class LinePenTool extends AbstractTool {
????public void drawOrExecute() {
????????System.out.println("Draw line.");
????}
}

//State'subclass
class EraseTool extends AbstractTool {
????public void drawOrExecute() {
????????System.out.println("Erase graph.");
????}
}

/**
* StateWrapper
*
*/
class ToolkitsPannel {
????//保持各种工具的列表
????Map <String, AbstractTool>toolsMap = new HashMap<String, AbstractTool>();
????
????AbstractTool currentTool;
????
????public void addTool(String toolName, AbstractTool tool) {
????????toolsMap.put(toolName, tool);
????}
????
????//改变状态
????public void selectTool(String toolName) {
????????currentTool = toolsMap.get(toolName);
????}
????
????//执行具体的行为
????public void drawOrExecute() {
????????if (currentTool != null) {
????????????currentTool.drawOrExecute();
????????} else {
????????????System.out.println("Please select a tool first.");
????????}
????}
????
}



执行Client,输出结果:
C:\State>javac *.java
C:\State>java Client
Draw line.
Erase graph.
C:\State>
我们可以发现,通过改变ToolkitsPannel对象的状态(选择不同的画图工具),便改变了它的行为,其中并没有任何条件判断语句。

热点排行