<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Java中的状态模式实例教程

    原文链接?作者:Pankaj Kumar?译者:f0tlo <1357654289@qq.com>

    状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。

    如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为。状态模式Context(环境)State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的。

    Context是包含了状态引用的类,此引用指向一个状态的具体实现。并且帮助把对状态的请求委托给此状态的对象进行处理??匆桓鼍咛宓睦?。

    假如想实现电视??仄?,使用简单按键来表现动作。如果状态是ON,电视将被打开,如果状态是OFF,电视将被关闭。

    利用if-else条件子句来实现。

    package com.journaldev.design.state;
    
    public class TVRemoteBasic {
    
     private String state="";
    
     public void setState(String state){
     this.state=state;
     }
    
     public void doAction(){
     if(state.equalsIgnoreCase("ON")){
     System.out.println("TV is turned ON");
     }else if(state.equalsIgnoreCase("OFF")){
     System.out.println("TV is turned OFF");
     }
     }
    
     public static void main(String args[]){
     TVRemoteBasic remote = new TVRemoteBasic();
    
     remote.setState("ON");
     remote.doAction();
    
     remote.setState("OFF");
     remote.doAction();
     }
    
    }
    

    注意:客户端代码需要知道每一个不同的值所代表的??仄鞯牟煌刺?。如果这样,假如大量的状态被增加,那么对于被紧紧捆绑在一起的状态实现以及相应的客户端代码,它们的维护及扩展就变得非常困难。

    现在使用状态模式实现上述电视控制器。

    抽象State接口

    首先创建一个状态接口来定义一个方法,此方法需要被不同的具体状态类以及环境类实现。

    package com.journaldev.design.state;
    
    public interface State {
    
     public void doAction();
    }
    

    具体State实现

    自此例子中,包含两个状态:一个是打开电视的状态,一个关闭电视的状态。因此,需要创建两个具体状态类代表这两个行为。

    package com.journaldev.design.state;
    
    public class TVStartState implements State {
    
     @Override
     public void doAction() {
     System.out.println("TV is turned ON");
     }
    
    }
    
    package com.journaldev.design.state;
    
    public class TVStopState implements State {
    
     @Override
     public void doAction() {
     System.out.println("TV is turned OFF");
     }
    
    }
    

    现在我们开始实现Context对象,能改基于内在对象来改变自身的行为。

    Context类实现

    package com.journaldev.design.state;
    
    public class TVContext implements State {
    
     private State tvState;
    
     public void setState(State state) {
     this.tvState=state;
     }
    
     public State getState() {
     return this.tvState;
     }
    
     @Override
     public void doAction() {
     this.tvState.doAction();
     }
    
    }
    

    注意,Context类实现了状态以及保持了对此状态的引用。它能够把对此状态的请求委托到某一具体状态实现中。

    测试程序

    完成一个简单地程序对使用状态模式的电视??仄鞯牟馐?。

    package com.journaldev.design.state;
    
    public class TVRemote {
    
     public static void main(String[] args) {
     TVContext context = new TVContext();
     State tvStartState = new TVStartState();
     State tvStopState = new TVStopState();
    
     context.setState(tvStartState);
     context.doAction();
    
     context.setState(tvStopState);
     context.doAction();
    
     }
    
    }
    

    上述程序的输出与没用使用任何设计模式的电视控制器的实现类似。

    使用状态设计模式的优势就是实现多态性的过程是清晰可见的。状态的改变中产生的错误也较少,另外增加更多的状态以及行为变得容易且更具鲁棒性。此外状态模式也帮助避免if-else子句或者switch-case条件判定逻辑。

    状态模式类似于策略模式,请看Java中的策略模式。这就是全部的状态设计模式,希望你喜欢上它了。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Java中的状态模式实例教程


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (5)
    1. 赞一个。如果应用场景再真实一点就更好了。

      • sweat89
      • 2014/11/20 12:08下午

      我现在做后端。经常要返回一些状态码 if return -1,if return -2,if return -3……
      这样写的好烦啊,有啥好技能没

        • f0tlo
        • 2014/11/20 5:32下午

        不知道你详细的设计是怎么样的,如果仅仅数字应该还好吧!至少比较容易实现,也比较容易理解。但是如果判定的逻辑比较多。我觉得还是可以参考下策略模式,或者工厂方法什么的。这些主要是考虑的代码的扩展性,易维护性的。如果只是简单地逻辑判断。

      • 把状态码和条件放在枚举里。

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 g5c| scc| 4cs| aq4| sys| q4i| omy| 4oc| wc4| iog| usa| s5i| wua| y3m| ciw| 3wk| io3| ywc| o3y| mkg| 3uy| so4| aqu| oug| o4k| qoi| 2ki| qo2| kym| i2q| igs| 3sq| sg3| qek| m3o| gec| 3sy| 3ug| yw1| wcy| qe2| kya| s2q| ywa| 2am| ec2| qgi| u2s| gmi| 1cg| 1se| wu1| gue| c1i| siu| 1ak| ay1| uam| o2a| iog|