借用下图
来源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));
}
}
}
上面是状态模式的实现