美文网首页
设计模式整理(7) 状态模式

设计模式整理(7) 状态模式

作者: 安静的蓝孩子 | 来源:发表于2019-02-14 14:20 被阅读0次

    学习《Android 源码设计模式解析与实践》系列笔记

    介绍

    状态模式和策略模式都是行为型模式。
    状态模式中的行为是由状态来决定的,不同的状态下有不同的行为。状态模式和策略模式的结构基本一样,但是它们的目的、本质是完全不一样的
    策略模式是封装一系列彼此独立、复杂多变、可替换的实现方式。状态模式是把对象的内在状态的变化封装到不同的状态对象里,状态变化时,其行为也随之改变。

    定义

    当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

    使用场景

    • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    • 代码中包含大量与对象状态有关的条件语句。

    结构

    状态模式 UML 图
    • Context : 环境类,维护了一个 State 子类实例,这个实例定义了对象的当前状态及行为。
    • State : 抽象状态类。
    • ConcreteStatteA/B : 具体状态类,实现了具体状态下的行为。

    实现

    比如说电视在开机和关机的两个状态下的遥控器不同行为。
    开机状态:遥控器可以控制上一个频道、下一个频道、提高音量、调低音量、关机。
    关机状态:遥控器只可以控制开机,其它的都只是闪红灯提示未开机。

    /**
     * 电视状态抽象类
     */
    public abstract class TvState {
    
        public abstract void nextChannel();
        public abstract void prevChannel();
        public abstract void turnUp();
        public abstract void turnDown();
    
    }
    
    /**
     * 关机状态,此时只有开机功能时有效
     */
    public class PowerOffState extends TvState {
        @Override
        public void nextChannel() {
            System.out.println("闪红灯提示未开机");
        }
    
        @Override
        public void prevChannel() {
            System.out.println("闪红灯提示未开机");
        }
    
        @Override
        public void turnUp() {
            System.out.println("闪红灯提示未开机");
        }
    
        @Override
        public void turnDown() {
            System.out.println("闪红灯提示未开机");
        }
    }
    
    /**
     * 开机状态,可以触发 上一个频道、下一个频道、提高音量、调低音量
     */
    public class PowerOnState extends TvState {
        @Override
        public void nextChannel() {
            System.out.println("下一个频道");
        }
    
        @Override
        public void prevChannel() {
            System.out.println("上一个频道");
        }
    
        @Override
        public void turnUp() {
            System.out.println("调高音量");
        }
    
        @Override
        public void turnDown() {
            System.out.println("调低音量");
        }
    }
    
    **
     * 电视遥控器,相当于 Context 角色
     */
    public class TvController {
    
        private TvState mTvState;
    
        public void setTvState(TvState tvState) {
            mTvState = tvState;
        }
    
        public void powerOff() {
            mTvState = new PowerOffState();
            System.out.println("关机啦");
        }
    
        public void powerOn() {
            mTvState = new PowerOnState();
            System.out.println("开机啦");
        }
    
        public void nextChannel() {
            mTvState.nextChannel();
        }
    
        public void prevChannel() {
            mTvState.prevChannel();
        }
    
        public void turnUp() {
            mTvState.turnUp();
        }
    
        public void turnDown() {
            mTvState.turnDown();
        }
    
    }
    
    public class Client {
    
        public static void main(String args[]) {
            TvController tvController = new TvController();
            tvController.powerOn();
            tvController.nextChannel();
            tvController.turnUp();
            tvController.powerOff();
            tvController.nextChannel();
        }
    
    }
    
    开机啦
    下一个频道
    调高音量
    关机啦
    闪红灯提示未开机
    

    总结

    优点:
    状态模式将所有与一个特定状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性和可维护性。

    缺点:
    状态模式的使用必然会增加系统类和对象的个数。



    相关文章:

    设计模式整理(1) 代理模式
    设计模式整理(2) 单例模式
    设计模式整理(3) Builder 模式
    设计模式整理(4) 原型模式
    设计模式整理(5) 工厂模式
    设计模式整理(6) 策略模式
    设计模式整理(7) 状态模式
    设计模式整理(8) 责任链模式
    设计模式整理(9) 观察者模式
    设计模式整理(10) 适配器模式
    设计模式整理(11) 装饰模式
    设计模式整理(12) 中介者模式

    相关文章

      网友评论

          本文标题:设计模式整理(7) 状态模式

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