状态模式

一.小结

  • 定义:允许对象内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  • 优点:1.结构清晰,避免了过多的if-else,提高了系统的可维护性 2.将所有与某个状态有关的行为放到一个类中,遵循单一职责,很容易新增一个状态 3.封装性非常好,将状态变换放置到类的内部来实现,遵循开闭原则
  • 缺点:状态有关的子类随着状态的增加而增加,可能导致子类太多
  • 使用场景:1.行为随状态改变而改变的场景 2.条件、分支判断语句的替代者
  • 通用UML图:
    状态模式

二.例子

   周一到周五我们作为打工人努力工作,周末时作为肥宅享受生活,这两种不同的状态可以用状态模式进行模拟:

  • 状态接口

    public interface IState {
    	// 自身状态对应的行为
        void doing();
        // 设置环境角色
        void setContext(Context context);
    }
    
  • 具体的状态子类

    public class FightState implements IState {
        
        @Override
        public void doing() {
            System.out.println("fight");
        }
    
        @Override
        public void setContext(Context context) {
            context.setState(this);
        }
    }
    
    public class LazyState implements IState {
    
        @Override
        public void doing() {
            System.out.println("lazy");
    
        }
    
        @Override
        public void setContext(Context context) {
            context.setState(this);
        }
    }
    
  • 环境对象

    public class Context {
    
        private IState state;
    
        public IState getState() {
            return state;
        }
    
        public void setState(IState state) {
            this.state = state;
        }
    
        public void doing() {
            state.doing();
        }
    
    }
    
  • 情景类

    public class Client {
        public static void main(String[] args) {
    
            IState fight = new FightState();
            IState lazy = new LazyState();
            Context context = new Context();
    
            context.setState(fight);
            context.doing();
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值