美文网首页
第5章 -行为型模式-状态模式

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

作者: 一介书生独醉江湖 | 来源:发表于2022-07-19 09:12 被阅读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中有资源,可以直接阅读)
    

    相关文章

      网友评论

          本文标题:第5章 -行为型模式-状态模式

          本文链接:https://www.haomeiwen.com/subject/qzirirtx.html