请在后台配置参数,参数名称:topads
编程语言 php java

java设计模式-状态模式State

java HTML我帮您 1年前  5285次浏览
定义:允许一个对象的内部状态改变时改变它的行为。对象看起来似乎修改了它的类。在状态模式中,我们创建代表多个状态的对象和一个上下文对象,这个上下文对象的行为随着状态对象的变化而变化。

本质:根据状态来分离和选择行为。

状态:对象实例的属性值。

行为:对象的功能,大多对应到方法上。

状态模式的功能:分离状态的行为,通过维护状态的变化,来调用不同装态对应的不同功能。

状态和行为是相关联的,可以描述为:状态决定行为。

状态模式和策略模式的结构师完全一样的,但它们的目的、实现、本质却完全不一样。状态模式的行为是平行的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的。

Context :环境,也称为上下文,用来定义客户感兴趣的接口,同时维护一个具体处理当前状态的实例对象。
State:状态接口,用来封装与上下文的一个特定状态所对应的行为。
ConcreteState:具体实现状态的处理类,每个实现一个跟上下文相关联的状态的具体处理。

状态处理对象的创建和销毁:
① 当需要使用状态对象的时候创建,使用完后就销毁。
② 提前创建它们并永不销毁(单例)。
③ 采用延时加载 + 缓存的方式。就是当第一次使用的时候创建,使用完后并不销毁而是把它缓存起来,下一次使用时,从缓存中获取对象,并由缓存框架来销毁状态处理对象。

状态的维护和转换:维护状态的数据,给状态设置不同的状态值;状态的转换,指的是根据状态的变化来选择不同的状态处理对象。

以开关灯为例:
package com.html580.state;

class Context {
private State state;

public Context() {
state = null;
}

public void setState(State state) {
this.state = state;
}

public State getState() {
return state;
}
}

interface State {
public void doAction(Context context);
}

class OnState implements State {
public void doAction(Context context) {
System.out.println("正在开灯");
context.setState(this);
}

public String toString() {
return "灯是亮着的";
}
}

class OffState implements State {
public void doAction(Context context) {
System.out.println("正在关灯");
context.setState(this);
}

public String toString() {
return "灯是关着的";
}
}

public class Client {
public static void main(String<> args) {
Context context = new Context();
OnState onState = new OnState();
onState.doAction(context);
System.out.println(context.getState().toString());
OffState stopState = new OffState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
输出结果:
正在开灯
灯是亮着的
正在关灯
灯是关着的







发表评论