设计模式之状态模式

状态模式

定义:对又状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为

状态模式主要角色如下:

环境角色:也称上下文,它定义了客户端程序需要的接口,维护一个当前对象,并将与状态相关的操作委托给当前状态对象处理

抽象形态角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为

具体形态角色:实现抽象状态所对应的行为


案例实现

王者荣耀花木兰的英雄技能会根据当前的英雄状态呈现不一样的效果,轻剑状态和重剑状态就是该英雄的具体状态模式。

代码实现:

定义花木兰抽象状态类,其中定义了该英雄的三个技能

public abstract class AbstractSkill {
   protected Context context;

   public void setContext(Context context){
       this.context=context;
   }

   //一技能
   public abstract void oneSkill();

   //二技能
   public abstract void secondSkill();

   //三技能
   public abstract void threeSkill();
}

定义在轻剑状态下的花木兰技能

public class LightSword extends AbstractSkill{

   @Override
   public void oneSkill() {
       System.out.println("【轻剑状态一技能:空裂斩】:向前位移");
   }

   @Override
   public void secondSkill() {
       System.out.println("【轻剑状态二技能:旋舞之华】:丢飞镖");
   }

   @Override
   public void threeSkill() {
       System.out.println("【轻剑状态三技能:切换重剑形态】:横扫一圈");
       //进行状态的切换
       context.setSkill(new Epee());
   }
}

定义在重剑形态下的花木兰技能

public class Epee extends AbstractSkill{
   @Override
   public void oneSkill() {
       System.out.println("【重剑状态一技能:空裂斩】:霸体蓄力");
   }

   @Override
   public void secondSkill() {
       System.out.println("【重剑状态二技能:旋舞之华】:霸体推进");
   }

   @Override
   public void threeSkill() {
       System.out.println("【重剑状态三技能:切换轻剑形态】:横扫一圈");
       //状态切换
       context.setSkill(new LightSword());
   }
}

定义环境角色类,其中组合了抽象状态类型的属性,外界通过环境角色来调用技能,根据形态的不同展示出来的技能介绍也不同

public class Context {
   private AbstractSkill skill;

   public Context(AbstractSkill skill){
       this.skill=skill;
       this.skill.context=this;
   }

   public void setSkill(AbstractSkill skill){
       this.skill=skill;
   }

   public void oneSkill(){
       skill.oneSkill();
   }

   public void secondSkill(){
       skill.secondSkill();
   }

   public void threeSkill(){
       skill.threeSkill();
       skill.setContext(this);
   }
}

定义测试类对状态模式进行测试

public class Test {
   public static void main(String[] args) {
       //初始化轻剑状态
       Context context=new Context(new LightSword());
       //轻剑状态下使用一技能
       context.oneSkill();
       //轻剑状态下使用二技能
       context.secondSkill();
       //轻剑状态下使用三技能切换为重剑形态
       context.threeSkill();
       //重剑形态一技能
       context.oneSkill();
       //重剑形态二技能
       context.secondSkill();
       //切换形态
       context.threeSkill();
       context.oneSkill();
       context.secondSkill();
   }
}

状态模式优缺点

优点

将所有与状态有关的行为放到一个类中,并且可以方便的增加新的状态,只需要改变对象的状态即可改变对象的行为

允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块

缺点

状态模式的使用必然会增加系统类和对象的个数

状态模式的结构和实现都较为复杂,如果使用不当将导致程序结构和代码的混乱

状态模式对开闭原则的支持不太好


状态模式使用场景

当一个对象的行为取决于它的状态时,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式

一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时


希望这篇文章对您有帮助,同时也希望您在闲暇之余能够帮忙使用微信扫一下下面的小程序二维码帮忙助力一下小程序的访问量,谢谢

微信小程序二维码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值