2011年12月31日土曜日

[设计模式] 状态模式 (Stage)

1. 定义
允许一个对象在其内部状态改变时改变它的行为, 这个对象看起来似乎修改了它的类
有效的替换充满在程序中的 ifelse 语句, 将不同条件下的行为封装在一个类里面, 再给这些类一个统一的父类来约束他们

2. 场景
2-1. 一个对象的行为取决于它的状态, 并且他必须在运行时刻根据状态改变它的行为
2-2. 一个操作中含有庞大的多分枝的条件语句, 并且这些分支依赖于该对象的状态, 这个状态通常用一个或多个枚举常量表示. 通常, 有多个操作包含这一相同的条件结构. 状态模式将每一个条件分支放入一个独立的类中, 这是得你可以根据对象自身的情况将对象的状态作为一个对象, 这一对象可以不依赖于其他对象而独立变化

2. 角色
2-1. 使用环境角色: 客户端需要的接口, 维护一个具体状态角色的实例, 这个实例来决定当前的状态
2-2. 抽象状态角色: 各个状态的接口或抽象类
2-3. 具体状态角色: 状态角色具体类

3-3. 实例
// 抽象状态角色
interface State {
    public void shot();
}

// 非正常状态
public class NonormalState implements State {
    public void shot(){
        System.out.println("今天你投篮十中一");
    }
}

// 正常状态
public class NormalState implements State {
    public void shot(){
        System.out.println("今天你投篮十中五");
    }
}

// 超常状态
public class SuperState implements State {
    public void shot(){
        System.out.println("今天你投篮十中十");
    }
}

// 使用环境角色
public class Player {
private State state = new NormalState(); // 默认正常状态
    public void setState(State state) {
        this.state = state;
    }
    public void shot() {
        state.shot();
    }
}

//
public class StateTest
{
    public static void main(String[] args) {
        Player player = new Player();
        player.shot(); // 正常下投篮
        player.setState(new NonormalState());
        player.shot(); // 不正常下投篮
        player.setState(new SuperState());
        player.shot(); // 超常下投篮
    }
}

0 件のコメント:

コメントを投稿