`
eksliang
  • 浏览: 593048 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

第十三篇 : (State)状态模式

阅读更多
第十三篇:状态模式
定义
       GoF为状态模式给出的定义是:允许一个对象在其内部状态发生变化时改变自己的行为,该对象看起来好像你改变他的类型。

UML静态类图



使用案例
     有这样一个电子颜料版,他上面有个手柄,可以拉(pull)也可以推(push),每次操作,都会改变颜料的颜色,他们的变化关系如图所示


用传统的方式解决
public void push(ColorState state){
		switch (state) {
		case RED:
			state=ColorState.GREEN;
			break;
		case GREEN:
			state=ColorState.BLUE;
		case BLUE:
			state=ColorState.RED;
		default:
			break;
		}
	}

          这段代码并没有什么不妥,我们知道,需求总是不停变化的,如果又有新的状态需要加入时,这时就得在push()方法中添加新的case分支语句,这就破坏了OCP原则【OCP:一个好的设计应该能够容纳新的功能或者需求的添加,但是添加的方式不是通过改变现有的类(模块),而是通过添加新的类(模块)来完成的,也就是说,在设计的时候,所有软件组成的的实体包括接口、类、函数等...必须都是可以拓展的,但是拓展的方式不是通过修改现有的东西】,上面的颜色很少,如果业务逻辑复杂,一个case分支就会超过百行,代码就会变得很难阅读和维护。

采用状态模式进行解决

       从上图可以看出,在不同的颜色下pash(推)和pull(拉)操作颜色变化都是不一样的,例如:当颜色为red时pull状态就变成Green,而Green的pull时状态就变成Blue,
根据上面的UML图我们为此我们抽象出一个状态接口State,它定义了与状态相关的方法。PaintBoard类包涵pull()、push()两个方法,它把这两个操作委托给当前状态完成。

PaintBoard类如下
public void push(ColorState state){
		switch (state) {
		case RED:
			state=ColorState.GREEN;
			break;
		case GREEN:
			state=ColorState.BLUE;
		case BLUE:
			state=ColorState.RED;
		default:
			break;
		}
	}


State接口代码如下
public interface State {
	String getColor();
	
	void push(PaintBoard paintBoard);
	
	void pull(PaintBoard paintBoard);
}


RedState类代码如下
public class RedState implements State{
	
	@Override
	public String getColor() {
		return "RED";
	}

	@Override
	public void push(PaintBoard paintBoard) {
		paintBoard.setState(new GreenState());
	}

	@Override
	public void pull(PaintBoard paintBoard) {
		paintBoard.setState(new BuleState());
	}

}


BuleState类代码如下
public class BuleState implements State {

	@Override
	public String getColor() {
		return "BULE";
	}

	@Override
	public void push(PaintBoard paintBoard) {
		paintBoard.setState(new RedState());
	}

	@Override
	public void pull(PaintBoard paintBoard) {
		paintBoard.setState(new GreenState());
	}

}


GreenState类代码如下
public class GreenState implements State {

	@Override
	public String getColor() {
		return "GREEN";
	}

	@Override
	public void push(PaintBoard paintBoard) {
		paintBoard.setState(new BuleState());
	}

	@Override
	public void pull(PaintBoard paintBoard) {
		paintBoard.setState(new RedState());
	}

}


测试代码如下
public class StateTest {
	public static void main(String[] args) {
		PaintBoard paintBoard=new PaintBoard(new RedState());
		System.out.println(paintBoard.getColor());
		paintBoard.push();
		System.out.println(paintBoard.getColor());
		paintBoard.push();
		System.out.println(paintBoard.getColor());
	}
}

这样,PaintBoard类的代码里就在也找不到条件分支语句啦,代码也更容易阅读。最重要的是如果以后要添加许多的状态,只要添加新的State接口的实现即可,符合OCP原则,我们知道软件维护是最麻烦的,在大型项目开发中,以后维护就变得相当的容易

























分享到:
评论

相关推荐

    [源代码] 《易学 设计模式》 随书源代码

    第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 (ChainofResponsibility) 第21章 独具匠心:命令模式 (Command) 第22章 步调一致:访问者模式 ...

    应用示例-Java设计模式及应用案例(第2版)-[共11页].pdf

    第 13 章 状态模式 181 若 mid ratio,则空闲率正常,表明内存处于"良好"状态;若 ratio,则空闲率低,表 明内存处于"紧张"状态。 先看程序执行界面,如图 13-3 所示。 图 13-3 内存监测界面图 程序主要完成以下...

    敏捷软件开发原则、模式与实践 C#版

    第11章 DIP:依赖倒置原则 第12章 ISP:接口隔离原则 第13章 写给C#程序员的UML概述 第14章 使用UML 第15章 状态图 第16章 对象图 第17章 用例 第18章 顺序图 第19章 类图 第20章 咖啡的启示 第三部分 薪水支付案例...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158...

    07-使用代理快速接入第三方库(1).html

    在书中,作者们将这二十三种设计模式分成了三类,分别是...状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( Interpreter ) 书中通过一幅图,剖析了这二十三种设计模式的关系。

    设计模式:可复用面向对象软件的基础--详细书签版

    5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor(访问者)—对象行为型 模式 218 5.12 行为模式的...

    C#23种设计模式_示例源代码及PDF

    备忘录模式: 备忘录模式 备忘录模式 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。 的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以 在将来合适的时候把这个...

    Delphi模式编程第一分卷

    第23章 状态模式(State) 23.1 模式解说 23.2 结构与用法 23.2.1 模式结构 23.2.2 代码模板 23.2.3 问题讨论 23.3 范例与实践 23.3.1 状态模式在信用卡账户管理系统中的应用 23.3.2 范例小结 第24章 策略...

    研磨设计模式(完整带书签).part2.pdf

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    Delphi模式编程第二分卷

    第23章 状态模式(State) 23.1 模式解说 23.2 结构与用法 23.2.1 模式结构 23.2.2 代码模板 23.2.3 问题讨论 23.3 范例与实践 23.3.1 状态模式在信用卡账户管理系统中的应用 23.3.2 范例小结 第...

    设计模式可复用面向对象软件的基础.zip

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    研磨设计模式(完整带书签).part1.pdf

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    设计模式--C++

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类行为型模式 214 5.11 VISITOR(访问者)—对象行为型模式 218 5.12 行为模式的讨论 228 ...

    24个设计模式与6大设计原则

    第 19 章 状态模式【STATE PATTERN】 236 第 20 章 原型模式【PROTOTYPE PATTERN】 255 第 21 章 中介者模式【MEDIATOR PATTERN】 268 第 22 章 解释器模式【INTERPRETER PATTERN】 286 第 23 章...

    Head.First设计模式_PDF.part1

    Head.First设计模式_PDF(高清扫描版) 第一部分(共三部分) ...10 状态模式:事物的状态 11 代理模式:控制对象访问 12 复合模式:模式中的模式 13 与设计模式相处:真实世界中的模式 A 附录A:剩下的模式

    研磨设计模式-part2

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    研磨设计模式-part4

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    研磨设计模式-part3

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    设计模式:可复用面向对象软件的基础

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    设计模式(.PDF)

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

Global site tag (gtag.js) - Google Analytics