• 设计模式——状态模式


      当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

    模式中的角色
      1、上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
      2、抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
      3、具体状态(Concrete State):实现抽象状态定义的接口。

    优点

      1、状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
      2、所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
      3、状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

    缺点

      导致较多的ConcreteState子类

    适用场景

      1、当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。
      2、一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

    实现

      根据人在睡觉和醒着的时候,不同的行为来实现一个小例子。类图如下:

    IState的定义:

    package com.lidaming.design16.state;
    
    public interface IState {
        void handle(HumanContext ctx);
    }
    View Code

    HumanContext的实现:

    package com.lidaming.design16.state;
    
    public class HumanContext {
        private IState state;
    
        public HumanContext(IState state) {
            this.state = state;
        }
    
        public void setState(IState state) {
            this.state = state;
        }
    
        public void action() {
            state.handle(this);
        }
    }
    View Code

    Sleep状态的实现:

    package com.lidaming.design16.state;
    
    public class Sleep implements IState {
    
        public void handle(HumanContext ctx) {
            System.out.println("sleeping-can not eat,speak,drink");
            ctx.setState(new Awake());
            
        }
    
    }
    View Code

    Awake状态的实现:

    package com.lidaming.design16.state;
    
    public class Awake implements IState {
    
        public void handle(HumanContext ctx) {
            System.out.println("awake-stand,can talk,eat,drink");
            ctx.setState(new Sleep());
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design16.state;
    
    public class Client {
        public static void main(String[] args) {
            HumanContext ctx = new HumanContext(new Sleep());
            ctx.action();
            ctx.action();
            ctx.action();
            ctx.action();
        }
    }
    View Code

    参考

    http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html
    http://blog.csdn.net/hguisu/article/details/7557252

  • 相关阅读:
    easyui datagrid 本地json数据 实现删除
    Kindeditor单独调用多图上传
    Kindeditor单独调用单图上传增加预览
    HTML <frameset> 标签
    easyui datagrid 获取行数据某个字段
    easyui datagrid 表格中操作栏 按钮图标不显示
    web安全之XSS跨站脚步攻击
    兼容低版本JS的Array.map方法
    关于wince串口接收数据异常
    VC中控制台程序和基于对话框的程序之间的区别
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5424446.html
Copyright © 2020-2023  润新知