No2.大话设计模式学习之状态、适配器、单例模式

本文介绍了设计模式中的状态模式、适配器模式和单例模式。状态模式用于简化复杂的条件判断逻辑,通过状态类封装不同状态的行为;适配器模式则是将不兼容接口转换为客户期望的接口,实现系统的解耦;单例模式确保一个类只有一个实例,提供全局访问点。文中探讨了各类模式的优点、缺点以及应用场景,并提供了相应的代码实现示例。
摘要由CSDN通过智能技术生成

2.设计模式-part4

  • 2.7 状态模式

    collapsed:: true
    • 描述:当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类中,可以简化复杂的判断逻辑
    • 原则1:状态模式允许一个对象在内部状态改变时改变它的行为,这个对象看起来好像改变了类
    • 原则2:状态模式将不同状态的行为分割开,将与特定状态相关的行为局部化(放入一个对象),通过新的类很容易新增状态。状态模式通过把各种状态的转移逻辑分不到 State 的子类之间,减少相互依赖,消除庞大的条件分支判断
    • 原则3:希望用户能扩展软件库/框架的内部组件
    • 好处1:可以避免创建者和具体产品之间的紧密耦合;
    • 好处2:状态即行为,通过状态的改变引起行为的变化,消除了条件逻辑,代码更简单清晰。
    • 好处3:与特定状态相关的代码都放在一起,提高了聚合性。
    • 好处4:添加一个状态非常容易,提高了扩展性
    • 坏处1:代码可能变得复杂,因为需要引入许多类
    • 坏处2:可能会创建太多功能较为单一的类。当状态粒度太小时,这种情况尤其明显。
    • 坏处3:新的行为可能涉及大量改动。因为该行为可能涉及到多个类,此时需要更新所有涉及到的类,将新的行为逻辑加入。
    • 坏处4:状态少或很少改变时有点小题大做,此时不应使用状态模式。
    • eg:要描述一名员工一天不同时间的工作状态,正常来看是比较简单的,直接从早上上班开始,根据一些时间变化切换到其他状态
      • 场景:可以将不同时间段、休息、睡觉等都设置为一个个状态,每个状态内部有自己的转换判断,比如上午可以切换到下午,但不能直接切换到下班。这样每种状态有自己的判断逻辑,行为和状态绑定,外部只需直接切换到想要的状态即可
      • 步骤:定义一系列状态以及在状态内部实现该状态的转移逻辑
        • 抽象状态 State,定义一个抽象方法,如 writeProgram
        • 实现不同的具体状态类:ForenoonStateNoonStateAfternoonState等,并重写抽象方法。
        • 实现一个上下文类:Work 用来管理当前状态
      • 注意事项:
        • 将状态的转换放到具体的状态类内部
        • 通过上下文直接或通过参数改变状态,而不同的状态对应不同的行为
      • 代码实现:
        • State
        • public abstract class State {
              public abstract void writeProgram(Work w);
          }
          
        • ConcreteState 类:
        • public class ForenoonState extends State {
              @Override
              public void writeProgram(Work w) {
                  if(w.getHour() < 12) {
                      System.out.println("当前时间:" + w.getHour() + "点 上午工作,精神百倍");
                  }else {
                      w.setState(new NoonState());
                      w.writeProgram();
                  }
              }
          }
          
          public class NoonState extends State {
              @Override
              public void writeProgram(Work w) {
                  if(w.getHour() < 13) {
                      System.out.println("当前时间:" + w.getHour() + "点 饿了,午饭;犯困,午休");
                  }else {
                      w.setState(new AfternoonState());
                      w.writeProgram();
                  }
              }
          }
          
          public class AfternoonState extends State {
              @Override
              public void writeProgram(Work w) {
                  if(w.getHour() < 17){
                      System.out.println("
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值