• 北风设计模式课程---28、状态模式


    北风设计模式课程---28、状态模式

    一、总结

    一句话总结:

    |||-begin

    State:接口或基类:封装与Context的特定状态相关的行为;

    State.java

    package com.ibeifeng.ex3;
    
    public abstract class State {
        public abstract void  doSomething(Person person);
    }

    ConcreteState:接口实现类或子类:实现了一个与Context某个状态相关的行为。

    MState.java、LState.java、SState.java、NoState.java

    MState.java、

    package com.ibeifeng.ex3;
    
    public class MState extends State {
    
        public void doSomething(Person person) {
            if(person.getHour() == 7) {
                System.out.println("吃早餐");
            } else {
                person.setState(new LState());
                person.doSomething();
            }
        }
    
    }

    |||-end

    状态模式:自己的事情自己解决:通过在具体的类中做判断而避免在统一的多情况判断

    1、什么是状态模式?

    允许通过改变对象的内部状态而改变对象的行为


       State模式也叫状态模式,是行为设计模式的
    一种。State模式允许通过改变对象的内部状态
    而改变对象的行为,这个对象表现得就好像修改
    了它的类一样。

    2、状态模式的应用场景?

    条件表达式过于复杂:状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。


    状态模式主要解决的是当控制一个对象状态转
    换的条件表达式过于复杂时的情况。把状态的判
    断逻辑转译到表现不同状态的一系列类当中,可
    以把复杂的判断逻辑简化。

    3、状态模式的角色和职责?

    Context:用户对象:拥有一个State类型的成员,以标识对象的当前状态; Person.java
    State:接口或基类:封装与Context的特定状态相关的行为; State.java
    ConcreteState:接口实现类或子类:实现了一个与Context某个状态相关的行为。 MState.java、LState.java、SState.java、NoState.java

    Context:用户对象:拥有一个State类型的成员,以标识对象的当前状态;
    Person.java
    State:接口或基类:封装与Context的特定状态相关的行为;
    State.java
    ConcreteState:接口实现类或子类:实现了一个与Context某个状态相关的行为。
    MState.java、LState.java、SState.java、NoState.java

    二、内容在总结中

    1、相关知识

    Context:用户对象:拥有一个State类型的成员,以标识对象的当前状态;
    Person.java


    State:接口或基类:封装与Context的特定状态相关的行为;
    State.java


    ConcreteState:接口实现类或子类:实现了一个与Context某个状态相关的行为。
    MState.java、LState.java、SState.java、NoState.java

     

    2、代码

    Context:用户对象:拥有一个State类型的成员,以标识对象的当前状态;

    Person.java

    package com.ibeifeng.ex3;
    
    public class Person {
        private int hour;
        private State state;
    
        public int getHour() {
            return hour;
        }
    
        public void setHour(int hour) {
            this.hour = hour;
        }
        
        public Person() {
            state = new MState();
        }
        
        public void doSomething(){
    //        if(hour == 7) {
    //            state = new MState();
    //            state.doSomething();
    //        } else if(hour == 12) {
    //            state = new LState();
    //            state.doSomething();
    //        } else if(hour == 18) {
    //            state = new SState();
    //            state.doSomething();
    //        } else {
    //            state = new NoState();
    //            state.doSomething();
    //        }
            state.doSomething(this);
            //复位,都所以方法以后再执行。
            state = new MState();
        }
    
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
    }

    State:接口或基类:封装与Context的特定状态相关的行为;

    State.java

    package com.ibeifeng.ex3;
    
    public abstract class State {
        public abstract void  doSomething(Person person);
    }

    ConcreteState:接口实现类或子类:实现了一个与Context某个状态相关的行为。

    MState.java、LState.java、SState.java、NoState.java

    MState.java、

    package com.ibeifeng.ex3;
    
    public class MState extends State {
    
        public void doSomething(Person person) {
            if(person.getHour() == 7) {
                System.out.println("吃早餐");
            } else {
                person.setState(new LState());
                person.doSomething();
            }
        }
    
    }

    LState.java、

    package com.ibeifeng.ex3;
    
    public class LState extends State{
    
        public void doSomething(Person person) {
            if(person.getHour() == 12) {
                System.out.println("吃中饭");
            } else {
                person.setState(new SState());
                person.doSomething();
            }
        }
    
    }

    SState.java、

    package com.ibeifeng.ex3;
    
    public class SState extends State {
    
        public void doSomething(Person person) {
            if(person.getHour() == 18) {
                System.out.println("吃晚饭");
            } else {
                person.setState(new NoState());
                person.doSomething();
            }
        }
    
    }

    NoState.java

    package com.ibeifeng.ex3;
    
    public class NoState extends State {
    
        public void doSomething(Person person) {
            System.out.println(person.getHour() +  "未定义");
        }
    
    }

    客户端调用: MainClass.java

    package com.ibeifeng.ex3;
    
    public class MainClass {
        public static void main(String[] args) {
            Person person = new Person();
            
            person.setHour(7);
            person.doSomething();
            
            person.setHour(12);
            person.doSomething();
            
            person.setHour(18);
            person.doSomething();
            
            person.setHour(8);
            person.doSomething();
            
            person.setHour(7);
            person.doSomething();
            
            person.setHour(18);
            person.doSomething();
            
        }
    }
     
  • 相关阅读:
    升级automake和autoconf
    源码安装rsyslog
    rsyslog 基本组成
    Openstack Nova 源码分析 — RPC 远程调用过程
    Openstack Nova 源码分析 — RPC 远程调用过程
    Wide character in print at hcp.pl line 21.
    http 响应头之location
    概述
    VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
    VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11087344.html
Copyright © 2020-2023  润新知