`
eksliang
  • 浏览: 598141 次
  • 性别: 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章 步调一致:访问者模式 ...

    第四章:Spring AOP API 设计模式1

    16. **状态模式(State)**:状态模式在Spring AOP中不是直接应用,但可以用于管理对象在不同状态下的行为,例如,一个业务对象在不同阶段可能有不同的行为。 17. **面试题精选**:理解并掌握以上设计模式在Spring ...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)

    Apress.Pro.Objective-C.Design.Patterns.for.iOS

    #### 第九部分:对象状态模式(State Of Object) - **第23章**:备忘录模式(Memento),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的...

    设计模式解析,经典设计模式讲解

    14. 组合模式(State):状态模式允许对象在其内部状态改变时改变其行为。对象看起来似乎修改了它的类。 15. 命令模式(Command):命令模式将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求...

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

    状态模式的关键在于将状态相关的操作封装到各自独立的状态类中,例如 `NormalState`, `OverDrawState`, 和 `StopState`。这样,当对象状态变化时,行为也会随之改变,而无需在条件语句或复杂的if-else结构中硬编码...

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

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

    第二十五 设计模式

    "第二十五 设计模式"这一主题通常指的是在设计模式的学习序列中,第25个被讨论的模式或者是关于设计模式的一个综合讨论。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。这些模式各有其特点和应用场景...

    [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 ) 书中通过一幅图,剖析了这二十三种设计模式的关系。

    PX4模式切换流程图commander.cpp.pdf

    13. `set_nav_state`函数用于确定飞行器根据`internal_state`和`main_state`是否能够完成指定的飞行模式。如果飞行器状态不允许,则模式将更新为`status->nav_state`。 14. `set_control_mode`函数用于设置控制模式...

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

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

    软件架构模式的种类 三种模式

    17. **State(状态)模式**:允许一个对象在其内部状态改变时改变它的行为。 18. **Visitor(访问者)模式**:表示一个作用于某对象结构中的各元素的操作。 #### 三、编码模式(Coding Pattern) 编码模式是指在...

    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...

Global site tag (gtag.js) - Google Analytics