状态模式

随遇而安–状态模式

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

使用场景  
    (1)一个对象的行为取决于它的状态,并且他必须在运行时根据状态改变它的行为。
    (2)代码中包含大量与对象状态有关的条件语句,例如,一个操作中含有庞大的多分支语句
        (if-else或switch-case)且这些分支依赖于该对象的状态。
    状态模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象
    ,这一对象可以不依赖于其他对象而独立变化,这样通过多态来去除过多的、重复的if-else等分支语句。

看一看状态模式的实际应用简例

下面我们就以电脑为例演示一下状态模式。

电脑状态有开机和关机,在开机状态下我们可以看文档,看电影,听音乐,玩游戏,写代码,但是此时在按开机是无效的
而在关机状态下这些都是无效的操作,只有按开机按钮时会生效。

//电脑状态接口,定义电脑的操作

public interface PCState {
    void word();
    void film();
    void music();
    void game();
    void code();
}   

//关机状态此时只有开机能做

public class PowerOffState implements PCState{
    @Override
    public void word() {

    }

    @Override
    public void film() {

    }

    @Override
    public void music() {

    }

    @Override
    public void game() {

    }

    @Override
    public void code() {

    }
}

//开机状态  可以进行一切操作

public class PowerOnState implements PCState {
    @Override
    public void word() {
        System.out.println("看文档");
    }

    @Override
    public void film() {
        System.out.println("看电影");
    }

    @Override
    public void music() {
        System.out.println("听音乐");
    }

    @Override
    public void game() {
        System.out.println("玩游戏");
    }

    @Override
    public void code() {
        System.out.println("写代码");
    }
}

// 电源操作

public interface PowerController {
    void start();
    void end();
}


public class PCController implements PowerController{

    PCState pcState;

    public PCState getPcState() {
        return pcState;
    }

    public void setPcState(PCState pcState) {
        this.pcState = pcState;
    }

    @Override
    public void start() {
        System.out.println("开机啦");
        setPcState(new PowerOnState());
    }

    @Override
    public void end() {
        System.out.println("关机啦");
        setPcState(new PowerOffState());
    }

}


//客户端调用Z
public class PCClient {
    public static void main(String[] args){
        PCController pcController = new PCController();
        pcController.start();

        pcController.getPcState().word();
        pcController.getPcState().film();
        pcController.getPcState().music();
        pcController.getPcState().game();   
        pcController.getPcState().code();

        pcController.end();

        //关机了 无用
        pcController.getPcState().word();
        pcController.getPcState().film();
        pcController.getPcState().music();
        pcController.getPcState().game();
        pcController.getPcState().code();
    }
}

贴一下结果   


    看文档
    看电影
    听音乐
    玩游戏
    写代码
    关机啦

    Process finished with exit code 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值