`
GavinZheng
  • 浏览: 15294 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

状态模式(State Pattern)

阅读更多
状态模式(State Pattern)
状态模式:当一个对象内在状态改变时允许其行为改变,这个对象看起来像改变其类。



思想:采用你中有我,我中有你的方法,将Context类中的逻辑方法到具体的State子类中实现。传递的过程中,交由子类的方法执行,如A-B的过程中,首先给Context定义一个状态A,使用MethodA激A当前的状态,交由SateA处理。A可走的流程只有B,在A中首先将Context状态设置为B,然后交由SateB处理。以下代码围绕着下面的状态转换图去实现。



package org.state;

public abstract class State {
	protected Context context;

	public void setContext(Context context) {
		this.context = context;
	}

	public abstract void MethodA();

	public abstract void MethodB();

	public abstract void MethodC();

	public abstract void MethodD();

}



package org.state;

public class Context {
	public final static StateA STATE_A = new StateA();
	public final static StateB STATE_B = new StateB();
	public final static StateC STATE_C = new StateC();
	public final static StateD STATE_D = new StateD();

	private State currentState;

	public State getCurrentState() {
		return currentState;
	}

	public void setCurrentState(State currentState) {
		this.currentState = currentState;
		this.currentState.setContext(this);
	}

	public void MethodA() {
		this.currentState.MethodA();
	}

	public void MethodB() {
		this.currentState.MethodB();
	}

	public void MethodC() {
		this.currentState.MethodC();
	}

	public void MethodD() {
		this.currentState.MethodD();
	}
}




package org.state;

//	A的下一状态为B
public class StateA extends State {

	@Override
	public void MethodA() {
		System.out.println("我是状态A");
	}

	@Override
	public void MethodB() {
		super.context.setCurrentState(Context.STATE_B);
		super.context.MethodB();
	}

	@Override
	public void MethodC() {
		// TODO Auto-generated method stub

	}

	@Override
	public void MethodD() {
		// TODO Auto-generated method stub

	}

}




package org.state;
//	B下一状态为C或者D
public class StateB extends State {

	@Override
	public void MethodA() {
		
	}

	@Override
	public void MethodB() {
		System.out.println("我是状态B");
	}

	@Override
	public void MethodC() {
		super.context.setCurrentState(Context.STATE_C);
		super.context.MethodC();
	}

	@Override
	public void MethodD() {
		super.context.setCurrentState(Context.STATE_D);
		super.context.MethodD();
	}

}




package org.state;

//	C的下一状态为D或者A
public class StateC extends State {

	@Override
	public void MethodA() {
		super.context.setCurrentState(Context.STATE_A);
		super.context.MethodA();
	}

	@Override
	public void MethodB() {

	}

	@Override
	public void MethodC() {
		System.out.println("我是状态C");
	}

	@Override
	public void MethodD() {
		super.context.setCurrentState(Context.STATE_D);
		super.context.MethodD();
	}

}




package org.state;

//	D的下一状态为A
public class StateD extends State {

	@Override
	public void MethodA() {
		super.context.setCurrentState(Context.STATE_A);
		super.context.MethodA();
	}

	@Override
	public void MethodB() {
	}

	@Override
	public void MethodC() {
	}

	@Override
	public void MethodD() {
		System.out.println("我是状态D");
	}

}




package org.state;

public class Client {
	public static void main(String[] args) {
		Context context = new Context();
		context.setCurrentState(new StateA());
		// 状态的转换A-B-C-D;
		System.out.println("---------------A-B-C-D--------------");
		context.MethodA();
		context.MethodB();
		context.MethodC();
		context.MethodD();
		// 由于A不能直接转化为C,所以后面的没有执行
		System.out.println("---------------A-C-D---------------");
		context.setCurrentState(new StateA());
		context.MethodA();
		context.MethodC();
		context.MethodD();
		// 状态的转换B-D-A;
		System.out.println("---------------B-D-A---------------");
		context.setCurrentState(new StateA());
		context.MethodB();
		context.MethodD();
		context.MethodA();
	}

}

输出结果:
---------------A-B-C-D--------------
我是状态A
我是状态B
我是状态C
我是状态D
---------------A-C-D---------------
我是状态A
---------------B-D-A---------------
我是状态B
我是状态D
我是状态A
  • 大小: 15.9 KB
  • 大小: 18.6 KB
分享到:
评论

相关推荐

    状态模式 State Pattern

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    JackChan1999#Java-Degisn-Patterns#状态模式-State Pattern1

    状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    设计模式之状态模式(State Pattern)

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

    nevstop#LabVIEW-Design-Pattern#状态模式(State Pattern)1

    状态模式定义Allow an object to alter its behavior when its internal state changes. The

    《设计模式》实战---状态模式(State Pattern)

    NULL 博文链接:https://zhangyan19870108.iteye.com/blog/1992409

    StatePattern.unitypackage

    StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。

    设计模式State模式源码

    State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) ...装饰模式(Decorator Pattern) 状态模式(State Pattern) 组合模式(Composite Pattern)

    用Java实现23种设计模式

    状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表...

    python 状态模式(示例)

    设计模式——状态模式状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同...

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

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

    C#设计模式(23种设计模式)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) ... 状态模式(State Pattern) @Author kwming

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式: ... 状态模式(State Pattern)  策略模式(Strategy Pattern)  模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册....状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    状态模式代码

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    33种JAVA设计模式DEMO

    状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype...23. 状态模式(State Pattern)

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ... 状态模式(State Pattern)

Global site tag (gtag.js) - Google Analytics