设计模式嘛,资料太多了,其实只要明白个大致就好,实际运用有很多改进,或者多种模式混合的情况。如果能掌握其精髓,明白为了解决什么问题,而采用了什么方法,这才算真正学会了设计模式,才能灵活运用。但是大部分情况得在实际项目中才能体会得到呀,所以这里也就简单的列下个人理解,对于编码时的结构设计,到现在还是挺让我纠结的。(我又不是处女座,为毛啊!)(吐槽下,这段太啰嗦了)
六大原则
- 开闭原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 迪米特法则,又称最少知道原则
- 合成复用原则
观察者模式(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借助了迭代器模式。