状态模式
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个行为对象在运行时不断切换。
与策略模式一样的是,这将容易产生重复代码,所以对于状态的接口,可以考虑改用抽象类来实现。