状态模式(行为型)

状态模式(State Pattern) 又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为.

设计场景:
你看电视机时需要频繁变更不同频道,如何设计?

此时有三个对象: 人Person,电视机TV,频道Channel.

我们只能调用TV对象的public方法来切换不同的频道,比如调用TV对象的toCCTV1()方法切换到cctv1;
代码实现时你会想直接在TV对象的每一个换频道方法中new出不同的频道对象,比如在toCCTV1()方法内部new出CCTV1对象然后调用该对象的display()方法即可.

很好(应该不会有人想直接换电视机对象的吧).

但是切换频道时不用给频道对象传参数,可重用频道对象,所以我们在TV类中保存静态的不同频道对象的引用,然后调用它的display方法;
这就是状态模式啦,简单吧.
这里写图片描述

又到了贴代码的时间:

Person类:

package com.shusheng.pattern.state;

public class Person {

    public static void main(String[] args) {
        TV tv = new TV();
        //哈哈,我不管,我只会控制电视机看不同频道
        tv.toCCTV1();
        tv.toCCTV2();
        tv.toCCTV3();
    }
}

TV电视机类:

package com.shusheng.pattern.state;

public class TV {

    private static  final Channel CCTV1 = new CCTV1(); 
    private static  final Channel CCTV2 = new CCTV2();
    private static  final Channel CCTV3 = new CCTV3();

    private Channel currentChannel ;//表示当前所收看的频道,当需要向外面提供当前频道的信息的使用需要用到
    public void toCCTV1() {
        this.currentChannel = CCTV1;//只是简单转了一下
        currentChannel.display();
    }

    public void toCCTV2() {
        this.currentChannel = CCTV2;//只是简单转了一手
        currentChannel.display();
    }

    public void toCCTV3() {
        this.currentChannel = CCTV3;//只是简单转了一手
        currentChannel.display();
    }
}

Channel频道接口:

package com.shusheng.pattern.state;

public interface Channel {

    public void display();
}

CCTV1类:

package com.shusheng.pattern.state;

public class CCTV1 implements Channel {

    @Override
    public void display() {
        System.out.println("开始观看cctv1");
    }
}

CCTV2类:

package com.shusheng.pattern.state;

public class CCTV2 implements Channel {

    @Override
    public void display() {
        System.out.println("开始观看cctv2");
    }
}

CCTV3类:

package com.shusheng.pattern.state;

public class CCTV3 implements Channel {

    @Override
    public void display() {
        System.out.println("开始观看cctv3");
    }
}

这里写图片描述


说下状态模式与其他模式的区别:

  1. 状态state模式VS外观Facade模式:状态模式隐藏的是同一类事物的操作,如频道切换(大同小异).但外观模式隐藏的是不同类型的对象操作,比如老板交代秘书自己要去餐厅吃饭,那么秘书必须内部调用司机对象开车,秘书自己还要打电话去预定座位等操作

  2. 状态state模式VS工厂Factory模式:状态模式隐藏的是同一大类事物的操作,如频道切换,但工厂模式只是负责生产对象,至于对象干嘛用并不知情.

  3. 状态state模式VS享元模式:依旧,状态模式只隐藏程序内部调用的细节,而享元模式只是负责对象的重用.

  4. 状态模式VS策略模式:两个模式很像,但是状态模式因为对象内部状态改变了才导致不同的行为,不同的状态对象内部封装了该状态所对应的所有操作;而策略模式出现不同行为并不是因为对象内部状态改变,而是对象构造出来之后就已经决定了它所具有的行为;


状态模式使用场景:
1. 对象的行为依赖于它所处的状态,即行为随状态改变而改变的场景;
2. 对象在某个方法里依赖于一重或多重条件分支语句,此时可以使用状态模式将分支语句中的每一个分支都包装到一个独立的类中,使得这些条件语句能够以类的方式独立存在和演化.如此,维护这些独立的类就不再影响到系统的其他部分了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值