zoukankan      html  css  js  c++  java
  • 状态模式

    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个行为对象在运行时不断切换。

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

  • 相关阅读:
    JDBC批处理数据
    JSP+Servlet 无数据库模拟登录过程
    idea常用插件
    如何破解IntelliJ IDEA2018教程
    java在线工具
    mysql快捷修改密码
    jdk1.8新特性
    java基础感觉白学了
    论JDK源码的重要性:一道面试题引发的无限思考
    数组算法经典实例
  • 原文地址:https://www.cnblogs.com/gabin/p/5494802.html
Copyright © 2011-2022 走看看