微信扫一扫打赏支持

北风设计模式课程---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();
        
    }
}

 

 

 
posted @ 2019-07-01 14:45  范仁义  阅读(468)  评论(0)    收藏  举报