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类即可。

    运行结果:

  • 相关阅读:
    ConfigurableApplicationContext
    JCA-Java加密框架
    Resource通配符路径 ——跟我学spring3
    Spring学习总结(四)——表达式语言 Spring Expression Language
    Spring讲解-----------表达式语言
    java多线程详解(5)-Threadlocal用法
    ThreadLocal 详解
    MessageFormat
    WPF中的导航框架(一)——概述
    在WPF中实现玻璃模糊效果
  • 原文地址:https://www.cnblogs.com/sx-bj-srr/p/state.html
Copyright © 2011-2022 走看看