设计模式之状态模式

设计模式 之 状态模式

状态模式,又称状态对象模式(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方法。

转载于:https://www.cnblogs.com/wangj1130/p/4822945.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值