设计模式——状态模式

场景引入

生活中,对于同一件事,根据我们当时的所处心情不同,我们会做出不一样的行为。就类似:以我观物,物皆著我之色彩。所谓的状态模式就是这样,一个类中方法根据状态的不同,而采取不一样的行为。比如:你的心情有:开心、生气。然后行为有:笑、哭。一般的实现方法就如下面的代码:

public class Person {
    private String state;

    public Person(String state) {
        this.state = state;
    }
    
    public void smile(){
        if(state.equals("happy")){
            System.out.println("我开心的笑了");
        }else if(state.equals("sad")){
            System.out.println("很生气,皮笑肉不笑");
        }
    }
    
    public void cry(){
        if(state.equals("happy")){
            System.out.println("喜极而泣");
        }else if(state.equals("sad")){
            System.out.println("气哭");
        }
    }
    
}

从代码中,我们可以看的出来,当我们的状态非常的多的时候,方法就显得十分的臃肿。为了解决这个问题,我们可以把状态提取出来。状态模式实现见代码实现。

UML

在这里插入图片描述

代码实现

State

public interface State {
    void smile();
    void cry();
}

Happy

public class Happy implements State {
    @Override
    public void smile() {
        System.out.println("开心的笑了");
    }

    @Override
    public void cry() {
        System.out.println("喜极而泣");
    }
}

Sad

public class Sad implements State{
    @Override
    public void smile() {
        System.out.println("伤心,皮笑肉不笑");
    }

    @Override
    public void cry() {
        System.out.println("气哭");
    }
}

Person

public class Person {
    private State state;

    public Person(State state) {
        this.state = state;
    }

    public void smile(){
        state.smile();
    }

    public void cry(){
        state.cry();
    }

}

test

public class test {
    public static void main(String[] args) {
        Person happyPerson = new Person(new Happy());
        happyPerson.smile();
        happyPerson.cry();

        Person sadPerson = new Person(new Sad());
        sadPerson.smile();
        sadPerson.cry();
    }
}

写在最后

状态模式适合那种状态可以增加,但是行为不能增加的情况。行为指的是例子中的smilecry。状态指的是例子中的happysad。因为状态增加只需要添加一个子类,但是行为增加就需要修改很多的代码。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值