zoukankan      html  css  js  c++  java
  • JAVA设计模式之状态模式(state)

    状态模式:

    • 根据状态决定动作
    • 当动作一定但是状态可扩展适合使用状态模式
    • 当动作变化不适合
    • 当状态不会扩展也没有必要使用使用传统的switch即可。

    先看一个没有使用状态模式的例子:

    package com.srr.dp.state;
    
    /**
     * 我的女朋友有很多种状态
     * 当给我的女朋友添加新的状态的时候下面所有方法的swith语句中都需要添加新的分支判断
     * 简而言之,这种实现方式当增加新的状态时非常不方便
     */
    public class GirFriend {
    
        private String name;
        private enum State {HAPPY,NORMAL}
        private State state;
    
        private void smile(){
            switch (state){
                case HAPPY:
                    System.out.println("哈哈哈大笑");
                    break;
                case NORMAL:
                    System.out.println("微微一笑");
                default:
                    System.out.println();
            }
        }
    
        private void cry(){
            switch (state){
                case HAPPY:
                    System.out.println("笑中带泪,感动的哭泣");
                    break;
                case NORMAL:
                    System.out.println("哇哇哭泣");
                    break;
                default:
                    System.out.println();
            }
        }
    
        private void say(){
            switch (state){
                case HAPPY:
                    System.out.println("侃侃而谈,风趣幽默");
                    break;
                case NORMAL:
                    System.out.println("沉默寡言,很少说话");
                default:
                    System.out.println();
            }
        }
    
    }

    使用状态模式之后代码如下:

    package com.srr.dp.state;
    
    /**
     * 状态抽象类
     */
    abstract public class State {
        abstract void smile();
        abstract void cry();
        abstract void say();
    }
    
    package com.srr.dp.state;
    
    /**
     * 女朋友的正常状态
     */
    public class NormalState extends State {
        @Override
        void smile() {
            System.out.println("微微一笑");
        }
    
        @Override
        void cry() {
            System.out.println("哇哇哭泣");
        }
    
        @Override
        void say() {
            System.out.println("沉默寡言,很少说话");
        }
    }
    
    package com.srr.dp.state;
    
    /**
     * 女朋友高兴状态
     */
    public class HappyState extends State {
        @Override
        void smile() {
            System.out.println("哈哈哈大笑");
        }
    
        @Override
        void cry() {
            System.out.println("笑中带泪,感动的哭泣");
        }
    
        @Override
        void say() {
            System.out.println("侃侃而谈,风趣幽默");
        }
    }
    
    package com.srr.dp.state;
    
    /**
     * 当添加新的状态的时候只需要添加新的状态类继承抽象state类
     */
    public class GirFriend2 {
    
        private String name;
        private State state;
    
        public GirFriend2(String name,State state){
            this.name = name;
            this.state = state;
        }
    
        public void smile(){
            state.smile();
        }
    
        public void cry(){
            state.cry();
        }
    
        public void say(){
            state.say();
        }
    
    }
    
    package com.srr.dp.state;
    
    /**
     * 测试类
     */
    public class T {
        public static void main(String[] args) {
            State state = new HappyState();
            GirFriend2 girFriend = new GirFriend2("程潇",state);
            girFriend.smile();
            girFriend.cry();
            girFriend.say();
        }
    
    }

    写到这里当我女朋友添加一种新的状态的时候只需要添加一个新的状态类继承抽象state类即可。

    运行结果:

  • 相关阅读:
    ecshop 在首页每个商品下显示已销售数量
    ecshop 用户名和邮箱都能登陆
    ecshop 模版商品详情页,不同商品调用不同模板
    ecshop文章详情页显示浏览数
    让ecshop编辑器功能更强大
    ecshop 改变sitemap.xml的位置
    ecshop 广告位固定
    ecshop 点购物车弹出提示框
    (三)简单工厂模式详解
    (一)单例模式详解
  • 原文地址:https://www.cnblogs.com/sx-bj-srr/p/state.html
Copyright © 2011-2022 走看看