状态模式

status(状态模式)

  上代码。。。女朋友起床了,没法安心写了。

  

package top.gabin.design.status;

/**
 * 行为
 *
 * @author linjiabin on  16/5/15
 */
public interface Behavior {
    void lossMoney();
    void eat();
    void watchMovie();
    void shopping();
}
package top.gabin.design.status;

/**
 * 行为状态
 *
 * @author linjiabin on  16/5/15
 */
public interface BehaviorMood extends Behavior {

}
package top.gabin.design.status;

/**
 * 坏心情
 *
 * @author linjiabin on  16/5/15
 */
public class BadMood implements BehaviorMood {
    private GirlFriend girlFriend;

    public BadMood(GirlFriend girlFriend) {
        this.girlFriend = girlFriend;
    }

    public void lossMoney() {
        System.out.println("我心情非常糟糕,但是也没办法");
    }

    public void eat() {
        System.out.println("我心情好一点了");
        girlFriend.setCurrentMood(girlFriend.getNormalMood());
    }

    public void watchMovie() {
        System.out.println("我心情好一点了");
        girlFriend.setCurrentMood(girlFriend.getNormalMood());
    }

    public void shopping() {
        System.out.println("我心情好很多了");
        girlFriend.setCurrentMood(girlFriend.getGoodMood());
    }
}
package top.gabin.design.status;

/**
 * 普通心情
 *
 * @author linjiabin on  16/5/15
 */
public class NormalMood implements BehaviorMood {

    private GirlFriend girlFriend;

    public NormalMood(GirlFriend girlFriend) {
        this.girlFriend = girlFriend;
    }

    public void lossMoney() {
        System.out.println("我不开心了");
        girlFriend.setCurrentMood(girlFriend.getBadMood());
    }

    public void eat() {
        System.out.println("我开心了");
        girlFriend.setCurrentMood(girlFriend.getGoodMood());
    }

    public void watchMovie() {
        System.out.println("我开心了");
        girlFriend.setCurrentMood(girlFriend.getGoodMood());
    }

    public void shopping() {
        System.out.println("我开心了");
        girlFriend.setCurrentMood(girlFriend.getGoodMood());
    }

}
package top.gabin.design.status;

/**
 * 好心情
 *
 * @author linjiabin on  16/5/15
 */
public class GoodMood implements BehaviorMood {
    private GirlFriend girlFriend;

    public GoodMood(GirlFriend girlFriend) {
        this.girlFriend = girlFriend;
    }

    public void lossMoney() {
        System.out.println("心情有点不开心,还不算太差");
        girlFriend.setCurrentMood(girlFriend.getNormalMood());
    }

    public void eat() {
        System.out.println("心情不错");
    }

    public void watchMovie() {
        System.out.println("心情很不错");
    }

    public void shopping() {
        System.out.println("心情极好,但也不能更好了");
    }
}
package top.gabin.design.status;

/**
 * 女朋友
 * @author linjiabin on  16/5/15
 */
public class GirlFriend implements Behavior {
    private NormalMood normalMood;
    private BadMood badMood;
    private GoodMood goodMood;

    public void setCurrentMood(BehaviorMood currentMood) {
        this.currentMood = currentMood;
    }

    public NormalMood getNormalMood() {
        return normalMood;
    }

    public BadMood getBadMood() {
        return badMood;
    }

    public GoodMood getGoodMood() {
        return goodMood;
    }

    public BehaviorMood getCurrentMood() {
        return currentMood;
    }

    private BehaviorMood currentMood;

    public GirlFriend() {
        currentMood = normalMood = new NormalMood(this);
        badMood = new BadMood(this);
        goodMood = new GoodMood(this);
    }

    public void lossMoney() {
        currentMood.lossMoney();
    }

    public void eat() {
        currentMood.eat();
    }

    public void watchMovie() {
        currentMood.watchMovie();
    }

    public void shopping() {
        currentMood.shopping();
    }

}
package top.gabin.design.status;

import org.junit.Test;

/**
 * 测试女朋友的行为
 *
 * @author linjiabin on  16/5/15
 */
public class TestGirlStatus {

    @Test
    public void testGirl() {
        GirlFriend girlFriend = new GirlFriend();
        girlFriend.lossMoney();
        girlFriend.shopping();
        girlFriend.lossMoney();
        girlFriend.lossMoney();
        girlFriend.watchMovie();
        girlFriend.eat();
    }

}

测试输出:

我不开心了
我心情好很多了
心情有点不开心,还不算太差
我不开心了
我心情好一点了
我开心了

  状态模式和策略模式是很相像的,但不同的是,状态模式偏向于状态经常地改变,而策略仅仅是从是什么转换成像什么,也就是说一般而言,策略只会在对象初始化的时候委托一个具体的行为对象,而状态模式则是有n个行为对象在运行时不断切换。

  与策略模式一样的是,这将容易产生重复代码,所以对于状态的接口,可以考虑改用抽象类来实现。

原文地址:https://www.cnblogs.com/gabin/p/5494802.html