第5章 -行为型模式-状态模式

2022-07-19  本文已影响0人  一介书生独醉江湖
行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、状态模式的简介
■ 状态模式(State Pattern)又称为状态对象模式;
■ 当一个对象内在状态改变时允许改变行为,这个对象看起来像改变了其类型;
  状态模式的核心是封装,状态的变更引起行为的变动,从外部看来就好像该对象对应的类发生改变一样;
image.png
状态模式3个角色:
■ 抽象状态(State)角色:
  该角色用以封装环境对象的一个特定状态所对应的行为;
■ 具体状态(Concrete State)角色:
  该角色实现环境的一个状态所对应的行为;
■ 环境(Context)角色:
  该角色定义客户端需要的接口,并负责具体状态的切换;
  它会保留一个具体状态类的实例,该实例给出环境对象的现有状态;
/**
 * 抽象状态角色
 */
public abstract class State {

    // 定义一个环境角色
    protected Context context;

    // 设置环境
    public void setContext(Context context) {
        this.context = context;
    }

    // 抽象行为
    public abstract void handle();
}
/**
 * 环境角色
 */
public class Context {

    // 定义状态
    public static State STATE1 = new ConcreteState1();

    public static State STATE2 = new ConcreteState2();

    // 当前状态
    private State currentState;

    // 获取当前状态
    public State getCurrentState() {
        return currentState;
    }

    // 设置当前状态
    public void setCurrentState(State currentState) {
        this.currentState = currentState;

        currentState.setContext(this);
    }

    // 行为委托
    public void handle1(){
        // 切换到状态1
        this.setCurrentState(STATE1);
        this.currentState.handle();
    }

    public void handle2(){
        // 切换到状态2
        this.setCurrentState(STATE2);
        this.currentState.handle();
    }
}
/**
 * 具体状态1
 */
public class ConcreteState1 extends State{

    // 状态1的行为逻辑处理
    @Override
    public void handle() {
        System.out.println("状态1的行为逻辑处理");
    }

}
/**
 * 具体状态2
 */
public class ConcreteState2 extends State{

    // 状态2的行为逻辑处理
    @Override
    public void handle() {
        System.out.println("状态2的行为逻辑处理");
    }

}
/**
 * 场景应用程序
 */
public class Client {

    public static void main(String[] args){
        // 定义环境角色
        Context context = new Context();
        // 执行行为
        context.handle1();
        context.handle2();
    }
}
# 控制台输出:
状态1的行为逻辑处理
状态2的行为逻辑处理
二、状态模式的优缺点
状态模式的优点:
  ■ 结构清晰;
  ■ 遵循设计原则;
  ■ 封装性非常好;
状态模式的缺点:
  ■ 子类太多,不易管理;
三、状态模式的实例
# 使用状态模式模拟电视频道切换的过程;
image.png
/**
 * 电视频道
 */
public interface Channel {

    void display();

}
/**
 * 电视机
 */
public class TV {

    public final static Channel CCTV1 = new CCTV1();

    public final static Channel CCTV2 = new CCTV2();

    public final static Channel CCTV3 = new CCTV3();

    private Channel channel;

    public void setChannel(Channel channel) {
        this.channel = channel;
    }

    /**
     * 播放CCTV1频道
     */
    public void disCCTV1(){
        this.setChannel(CCTV1);
        this.channel.display();
    }

    /**
     * 播放CCTV2频道
     */
    public void disCCTV2(){
        this.setChannel(CCTV2);
        this.channel.display();
    }

    /**
     * 播放CCTV3频道
     */
    public void disCCTV3(){
        this.setChannel(CCTV3);
        this.channel.display();
    }
}
/**
 * 频道 CCTV1
 */
public class CCTV1 implements Channel{

    @Override
    public void display() {
        System.out.println("CCTV1 新闻联播");
    }

}
/**
 * 频道 CCTV2
 */
public class CCTV2 implements Channel{

    @Override
    public void display() {
        System.out.println("CCTV2 经济半小时");

    }
}
/**
 * CCTV3
 */
public class CCTV3 implements Channel{

    @Override
    public void display() {
        System.out.println("CCTV3 非常6+1");
    }
}
/**
 * 测试类
 */
public class Test {

    public static void main(String[] args){
        TV tv = new TV();
        tv.disCCTV1();
        tv.disCCTV2();
        tv.disCCTV3();
    }
}
# 控制台输出:
CCTV1 新闻联播
CCTV2 经济半小时
CCTV3 非常6+1
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
上一篇下一篇

猜你喜欢

热点阅读