几个设计模式的要点

设计模式嘛,资料太多了,其实只要明白个大致就好,实际运用有很多改进,或者多种模式混合的情况。如果能掌握其精髓,明白为了解决什么问题,而采用了什么方法,这才算真正学会了设计模式,才能灵活运用。但是大部分情况得在实际项目中才能体会得到呀,所以这里也就简单的列下个人理解,对于编码时的结构设计,到现在还是挺让我纠结的。(我又不是处女座,为毛啊!)(吐槽下,这段太啰嗦了)

六大原则

  1. 开闭原则
  2. 里氏替换原则
  3. 依赖倒置原则
  4. 接口隔离原则
  5. 迪米特法则,又称最少知道原则
  6. 合成复用原则

观察者模式(Observer Pattern)

  • 常说的事件机制。
  • 好处在于可以实现一对多的关系。发送者只管发送,如果要新增观察者,不需要修改已有代码,让新观察者自己注册到发送者去即可。
  • 主要成员:主题(Subject,或者说发送者),观察者(Observer)
  • 发送者成员:添加观察者的方法(Add),移除观察者的方法(Remove),存储观察者的数据结构(Dictionary/List),触发事件的接口(Fire)。
  • 观察者成员:供发送者调用的接口(或者说对通知作出响应的接口)
  • 比如游戏中金币发生改变,然后UI界面中的TopBar界面的金币数量需要刷新,道具界面的金币数量也需要刷新。假设没有观察者模式,那么我们需要先获取所有需要刷新的界面,判断界面不为空,然后调用刷新接口。而有了观察者模式,只需要各个需要刷新的界面,自己注册事件监听,界面移除,自己移除监听。简单的说就是解耦合啦,各管各的。
  • 观察者成员在C#中不一定要是个类,可以是个Action什么的,反正本质也就是提供一个可以让发送者调用的方法。

状态模式(State Pattern)

  • 常说的状态机。
  • 主要成员:状态类(State),状态管理类(State Machine)。
  • 状态类:一些和该状态要做的事情有关的方法咯。可能有OnEnter,OnUpdate,OnExit分别表示进入该状态要做什么,状态中要做什么,离开状态要做什么。也可能就一个DoState。
  • 状态管理类:当前状态类的引用,改变状态的接口。
  • 状态模式也是为了 对扩展开放,对修改关闭。减少复杂的if-else判断分支。
  • 比如某个游戏界面中有开启,关闭,等待匹配,挂机,战斗中等状态,在不同状态时,某个界面块有不同的表现,这时候会有一个UpdateSth的方法。假设没有状态模式,那么就需要在UpdateSth通过if-else来判断当前状态应该做什么,一旦有新的状态加入,又需要修改这个方法。 但是有了状态模式,所有状态都会实现一个UpdateSth方法,而界面通过改变状态,让状态类自行调用自己的UpdateSth。这样就算有新状态加入,也不需要修改已有的UpdateSth代码,只需要添加新的状态类即可。 从而保证了代码的稳定性,不动到旧代码。

对象池模式(Object Pool)

  • 常说的回收池/对象池。
  • 主要成员:对象池的管理者(ObjectPool)(单例模式)
  • 对象池的管理者:存储对象的数据结构ObjectPool(Stack/Queue/List),获取对象的方法(AcquireObject),返还对象的方法(ReleaseObject)。
  • 对象池模式算是单例模式和享元模式的混合吧,当然还是和享元模式有点本质的不同的。
  • 主要是对象的复用,可能还需要对复用对象的数据进行重置,然后提供给调用者使用。
  • 游戏中的子弹回收。

迭代器模式(Iterator Pattern)

  • C#中的IEnumrabale和IEnumrator。
  • 主要成员:迭代器(iterator),迭代器获取器(Container)
  • 迭代器:获取下一个对象的方法(Next), 是否有下一个对象(HasNext) (变体很多,本质就是为了获取下一个对象)
  • 迭代器获取器:获取迭代器的方法(GetIterator)
  • 迭代器平时还没咋用到,主要是C#中的foreach,StartCoroutine借助了迭代器模式。

参考

菜鸟教程-设计模式

你可能感兴趣的:(几个设计模式的要点)