天天看点

状态模式 - 行为模式

个人理解:    

模式类型:

    State  状态模式 - 行为模式

意图:

    Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

    An object-oriented state machine

    wrapper + polymorphic wrappee + collaboration

    当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。

概述:

    主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

    在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。

角色:

    上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

    抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

    具体状态(Concrete State):实现抽象状态定义的接口。

结构图:

状态模式 - 行为模式

模式的应用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。

一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

模式的优缺点:

状态模式的优点:

    1 ) 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来: State模式将所有与一个特定的状态相关的行为都放入一个对象中。因为所有与状态相关的代码都存在于某一个State子类中, 所以通过定义新的子类可以很容易的增加新的状态和转换。另一个方法是使用数据值定义内部状态并且让 Context操作来显式地检查这些数据。但这样将会使整个Context的实现中遍布看起来很相似的条件if else语句或switch case语句。增加一个新的状态可能需要改变若干个操作, 这就使得维护变得复杂了。State模式避免了这个问题, 但可能会引入另一个问题, 因为该模式将不同状态的行为分布在多个State子类中。这就增加了子类的数目,相对于单个类的实现来说不够紧凑。但是如果有许多状态时这样的分布实际上更好一些, 否则需要使用巨大的条件语句。正如很长的过程一样,巨大的条件语句是不受欢迎的。它们形成一大整块并且使得代码不够清晰,这又使得它们难以修改和扩展。 State模式提供了一个更好的方法来组织与特定状态相关的代码。决定状态转移的逻辑不在单块的 i f或s w i t c h语句中, 而是分布在State子类之间。将每一个状态转换和动作封装到一个类中,就把着眼点从执行状态提高到整个对象的状态。这将使代码结构化并使其意图更加清晰。

    2) 它使得状态转换显式化: 当一个对象仅以内部数据值来定义当前状态时 , 其状态仅表现为对一些变量的赋值,这不够明确。为不同的状态引入独立的对象使得转换变得更加明确。而且, State对象可保证Context不会发生内部状态不一致的情况,因为从 Context的角度看,状态转换是原子的—只需重新绑定一个变量(即Context的State对象变量),而无需为多个变量赋值

    3) State对象可被共享 如果State对象没有实例变量—即它们表示的状态完全以它们的类型来编码—那么各Context对象可以共享一个State对象。当状态以这种方式被共享时, 它们必然是没有内部状态, 只有行为的轻量级对象。

状态模式的缺点:

    1) 状态模式的使用必然会增加系统类和对象的个数。

    2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

代码(其实读UML图要比代码还要一目了然):

状态模式 - 行为模式
package com.lee.desingerPattener23.state;

public class StatePatternDemo {
	public static void main(String[] args) {
		Context context = new Context();
		StartState startState = new StartState();
		startState.doAction(context);
		System.out.println(context.getState().toString());

		StopState stopState = new StopState();
		stopState.doAction(context);
		System.out.println(context.getState().toString());
	}
}
interface State {
	public void doAction(Context context);
}
class Context {
	private State state;
	public Context() {
		state = null;
	}
	public void setState(State state) {
		this.state = state;
	}
	public State getState() {
		return state;
	}
}
class StartState implements State {
	public void doAction(Context context) {
		System.out.println("Player is in start state");
		context.setState(this);
	}
	public String toString() {
		return "Start State";
	}
}

class StopState implements State {
	public void doAction(Context context) {
		System.out.println("Player is in stop state");
		context.setState(this);
	}
	public String toString() {
		return "Stop State";
	}
}
           

所有模式:

     创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    补充模式:空对象模式

参考/转自:

https://sourcemaking.com/design_patterns/state

http://www.cnblogs.com/xudong-bupt/p/3617860.html

http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

http://blog.csdn.net/hguisu/article/details/7557252

转载请注明:   http://blog.csdn.net/paincupid/article/details/46984077

继续阅读