• 设计模式之状态模式


    设计模式 之 状态模式

    状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。


    例:人在高兴时会笑(哈哈大笑)、会哭(喜极而泣),在不高兴时也可能会笑(苦笑)、会哭(痛哭流泪)。

    第一版:以最简单的方式完成功能

    public class Person {
        private PersonState state;
        
        public Person(PersonState state) {
            this.state = state;
        }
        
        public void changeState(PersonState state) {
            this.state = state;
        }
        
        public void smile() {
            if(state == PersonState.HAPPY) {
                System.out.println("哈哈大笑");
            } else if(state == PersonState.UNHAPPY) {
                System.out.println("苦笑");
            }
        }
        
        public void cry() {
            if(state == PersonState.HAPPY) {
                System.out.println("喜极而泣");
            } else if(state == PersonState.UNHAPPY) {
                System.out.println("痛哭流泪");
            }
        }
        
    }
    
    enum PersonState {
        HAPPY, UNHAPPY
    }
    View Code

    测试

    public static void main(String[] args) {
        Person p = new Person(PersonState.HAPPY);
        p.smile();
        p.cry();
        p.changeState(PersonState.UNHAPPY);
        p.smile();
        p.cry();
    }
    View Code

    OK,问题是解决了,Person可以在高兴和不高兴时笑和哭表现出不同的状态,问题来了,一个人并不是只有高兴和不高兴两种状态,比如正常情况下人也会笑(微笑)也会哭(感动的哭),此时要对这种状态做出响应,只能修改Person类的代码了!

    版本二:解耦

    抽象出Person的状态

    public interface PersonState {
        void smile();
        void cry();
    }
    View Code

     高兴时的哭、笑

    public class PersonHappyState implements PersonState {
        @Override
        public void smile() {
            System.out.println("哈哈大笑");
        }
    
        @Override
        public void cry() {
            System.out.println("喜极而泣");
        }
    }
    View Code

    不高兴时的哭、笑

    public class PersonUnhappySate implements PersonState {
        @Override
        public void smile() {
            System.out.println("苦笑");
        }
    
        @Override
        public void cry() {
            System.out.println("痛哭流泪");
        }
    }
    View Code

     Person

    public class Person {
        private PersonState state;
        
        public Person(PersonState state) {
            this.state = state;
        }
        
        public void changeState(PersonState state) {
            this.state = state;
        }
        
        public void smile() {
            state.smile();
        }
        
        public void cry() {
            state.cry();
        }
    }
    View Code

     测试

    public class Test {
        public static void main(String[] args) {
            PersonState happy = new PersonHappyState();
            Person p = new Person(happy);
            p.smile();
            p.cry();
            PersonState unhappy = new PersonUnhappyState();
            p.changeState(unhappy);
            p.smile();
            p.cry();
        }
    }
    View Code

     OK,这时再添加正常状态时哭、笑就很简单了,只需实现PersonState接口,实现自己的smile和cry方法。

    作者:踮起脚尖眺望
    出处:http://www.cnblogs.com/wangj1130
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    C# 课堂总结2-数据类型及转换方式
    C# 课堂总结1-二进制转换
    C++
    C++ 程序设计语言
    VS编译器问题总结
    go 笔记
    SIP协议 会话发起协议(二)
    SIP协议 会话发起协议(一)
    201707 一些好的文章
    编程拾穗
  • 原文地址:https://www.cnblogs.com/wangj1130/p/4822945.html
Copyright © 2020-2023  润新知