zoukankan      html  css  js  c++  java
  • 状态模式(State)(开关灯,状态实例为类,不同状态,不同行为)

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

        在软件开发过程中,很多对象也会像水和信号灯一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将有不同的行为。最直接的解决方案是将所有可能考虑到,然后使用if else 语句来进行不同情况的处理,但是这种硬编码方法在对待复杂状态的判断就显得力不从心了,增加新的状态或修改一个状态都有可能会导致原有的程序大幅度·的修改。

            我们可以将不同的状态设为对应的状态对象,再将状态抽象化调用,便不必考虑复杂的状态逻辑。

            现在我们来用状态模式描述灯的亮与暗即状态转换。

    抽象状态接口类:

    1 public interface LightState {
    2 public void PressSwitch(Light light);//每种状态可以向其他状态转换   需要将灯的实体传入状态 类  以便于状态类对灯进行更多的动作
    3 }

    具体状态类:

    1 public class LightOff implements LightState {
    2 
    3     @Override
    4     public void PressSwitch(Light light) {
    5      System.out.println("现在灯暗着");
    6      light.setState(new LightOn());
    7     }
    8 
    9 }
    1 public class LightOn implements LightState {
    2 
    3     @Override
    4     public void PressSwitch(Light light) {
    5       System.out.println("现在灯亮着");
    6       light.setState(new LightOff());
    7     }
    8 
    9 }

    山下文角色:

     1 public class Light {
     2 private LightState state;//灯存在属性为它的状态
     3 
     4 public Light(LightState state) {
     5     super();
     6     this.state = state;
     7 }
     8 
     9 public LightState getState() {
    10     return state;
    11 }
    12 
    13 public void setState(LightState state) {
    14     this.state = state;
    15 }
    16 /*
    17  *     light   自身并无太多功能     不同状态的行为依托于具体的状态 将自身需要传入并调用具体状态的方法操作自身
    18  */
    19 public void pressSwhitch(){
    20     state.PressSwitch(this);
    21 }
    22 }

    客户测试类:

     1 public class StatePattern {
     2 
     3     public static void main(String[] args) {
     4     Light light = new Light(new LightOff());//创建实体灯并附初始状态暗着
     5     
     6     light.pressSwhitch();
     7     light.pressSwhitch();
     8 
     9     }
    10 
    11 }

    运行结果:

    现在灯暗着
    现在灯亮着
  • 相关阅读:
    Linux 系统高级编程 ¶
    手表维修_机械表维修_手表维修网
    epel
    集合包含关系的快速算法 simcity 博客园
    微软的无线鼠标的电池用的快啊,今天又换新的了
    VIM字符集编码设置_icewater_新浪博客
    【索尼LT29i】索尼(SONY)LT29i 3G手机(黑色)WCDMA/GSM 【行情 报价 价格 评测】
    Python模块学习 fileinput 成长的点滴,记录与分享 博客频道 CSDN.NET
    fedora8 使用小记之:终端字体设置
    Wen Quan Yi Open Source Chinese: About
  • 原文地址:https://www.cnblogs.com/the-wang/p/7289778.html
Copyright © 2011-2022 走看看