美文网首页
状态模式

状态模式

作者: YoungerDev | 来源:发表于2018-04-10 09:05 被阅读43次

    Android进阶之设计模式

    状态模式

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

    使用场景:

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

    举个电视剧的例子:

    第一版代码:

    //电视遥控器,含有 开机,关机,下一个频道,上一个频道,调高音量,调低音量
    public class TVController {
        //开机状态
        private final static int POWER_ON = 1;
    
        //关机状态
        private final static int POWER_OFF = 2;
    
        private int state = POWER_OFF;
    
        public void powerOn(){
            if (state == POWER_OFF){
                System.out.println("开机啦");
            }
            state = POWER_ON;
        }
    
        public void powerOff(){
            if (state ==POWER_ON){
                System.out.println("关机啦");
            }
            state = POWER_OFF;
        }
    
        public void nextChannel(){
            if (state == POWER_ON){
                System.out.println("下一个频道");
            }else {
                System.out.println("两个红灯提示没有开机");
            }
        }
    
    
        public void prevChannel(){
            if (state == POWER_ON){
                System.out.println("上一个频道");
            }else {
                System.out.println("两个红灯提示没有开机");
            }
        }
    
        public void turnUp(){
            if (state == POWER_ON){
                System.out.println("调高音量");
            }else {
                System.out.println("两个红灯提示没有开机");
            }
        }
    
        public void turnDown(){
            if (state == POWER_ON){
                System.out.println("调低音量");
            }else {
                System.out.println("两个红灯提示没有开机");
            }
        }
    }
    
    

    这样就有很多重复代码,相对较为混乱. 下面就使用状态模式 简单处理一下.

    
    //定义电视操作的函数
    public interface TvState {
    
        public void nextChannel();
    
        public void prevChannel();
    
        public void turnUp();
    
        public void turnDown();
    
    }
    
    
    public class PowerOffStatus implements TvState{
        @Override
        public void nextChannel() {
    
        }
    
        @Override
        public void prevChannel() {
    
        }
    
        @Override
        public void turnUp() {
    
        }
    
        @Override
        public void turnDown() {
    
        }
    }
    
    
    public class PowerOnState implements 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 interface PowerController {
    
        public void powerOn();
    
        public void powerOff();
    }
    
    
    
    public class TvControll implements PowerController{
        TvState tvState;
    
        public void setTvState(TvState tvState) {
            this.tvState = tvState;
        }
    
        @Override
        public void powerOn() {
            setTvState(new PowerOnState());
            System.out.println("开机啦");
        }
    
        @Override
        public void powerOff() {
            setTvState(new PowerOffStatus());
            System.out.println("关机啦");
        }
    
        public void nextChannel(){
            tvState.nextChannel();
        }
    
        public void prevChannel(){
            tvState.prevChannel();
        }
    
        public void turnUp(){
            tvState.turnUp();
        }
    
        public void turnDown(){
            tvState.turnDown();
        }
    
    }
    

    Client 使用

    
     public static void main(String[] args) {
     
            TvControll tvControll = new TvControll();
    
            //设置开机状态
            tvControll.powerOn();
            //下一个频道
    
            tvControll.nextChannel();
    
            //调高音量
            tvControll.turnUp();
    
            //关机状态
            tvControll.powerOff();
            //调低音量
            tvControll.turnDown();
    
    }
    

    打印出来的:

    开机啦
    下一个频道
    声音跳大
    关机啦
    
    

    关机后没有办法调低音量的. 这个虽然代码,类多了,但是逻辑很清晰明了.

    相关文章

      网友评论

          本文标题:状态模式

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