设计模式学习记录 状态模式&策略模式

 借用下图

   

来源https://blog.csdn.net/qiulongtianshi/article/details/7570021

面向对象的核心:

可维护,可扩展,可复用,灵活性好。

 

七大基本原则

1. 单一职责 SRP
核心:解耦和增强内聚性(高内聚,低耦合)

2.开放封闭原则

OCP Open close Pricleple

(1)可以把这些不变的部分加以抽象成不变的接口,

  (2)接口的最小功能设计原则。根据这个原则,原有的接口要么可以应对未来的扩展;

  (3)不足的部分可以通过定义新的接口来实现;

  (4)模块之间的调用通过抽象接口进行,这样即使实现层发生变化,也无需修改调用方的代码。

一个软件实体应当对扩展开放,对修改关闭

提取容易变化的,变成抽象。

例子:

重构后

构造抽象来隔离那些变化[ASD]

3.里氏替换原则

在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类并出现在父类能够出现的任何地方)

 例如,在状态模式里,有抽象IState状态类,它有个Handle方法,它有子类,StateA,StateB,在Context里有个SetState 方法,这个时候可以把父类(基类)当做参数一个参数, 使用这个方法的时候传进状态A,这个时候调用handle方法就是调用A的Handle;

 

上面是 策略模式   ,和下面的状态模式 相似,但是不同点就是    状态模式 是针对 某个 具体 状态的, 而策略模式是针对某种策略的,  调用者 也不太一样,

有时候 要 经常切换状态,没次 进入某种 状态 要处理的工作流程都是一样的,

状态转变的条件,进入 某个状态前要处理的事情, 在某个状态里要处理的事情,离开某个状态要处理的事情。

EnterState

ExitState

StayState

这个三个方法 每个 状态都一样。

比如 简单的FSM 系统,  状态模式 针对的就是状态, 转变的条件处理  由  状态类自己去处理转变;

再Handle 中 根据 按键  不同而切换 不同 状态,  比如 一开始是Idle状态,

用户按下了A键, 这时调用Handle方法,切换 技能状态,每个状态 处理也不一样,进入SkillA状态 ,调用EnterState 方法,

hanle 里处理,可能在 某个时间内 用户又按下了B键 ,这个时候 就要切换到新的状态,技能B,超时 就返回发呆状态。

FSM中的处理

 

 

 

状态A 中的 处理。

 

 

 

区别主要体现在行为上,而不是结构上,所以,看时序图就能很好的看出两者的区别。

区别: https://blog.csdn.net/ruangong1203/article/details/52514919

 

状态模式:

public class  _01StateDesignMode : MonoBehaviour
{
    private void Start()
    {
        Context context = new Context();

        context.SetState(new ConcreteStateA(context));

        context.Handle(20);
        context.Handle(5);
        context.Handle(11);
        context.Handle(10);
    }
}
public class Context
{
    private  IState m_stateA;

    public void SetState(IState state)
    {
        m_stateA = state;
    }

   public void Handle(int arg)
    {
        m_stateA.Handle(arg);
    }
}

public interface IState
{
    void Handle(int arg);
}
public class ConcreteStateA : IState
{
    public ConcreteStateA( Context context)
    {
        m_context = context;
    }
    private Context m_context;
    public void Handle(int arg)
    {
        Debug.Log("ConcreteStateA");

        if (arg>10)
        {
            m_context.SetState(new ConcreteStateB(m_context));
        }
    }
}
public class ConcreteStateB : IState
{
    public ConcreteStateB(Context context)
    {
        m_context = context;
    }
    private Context m_context;
    public void Handle(int arg)
    {
        Debug.Log("ConcreteStateB");
        if (arg<=10)
        {
            m_context.SetState(new ConcreteStateA(m_context));
        }
    }
}

上面是状态模式的实现

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值