架构设计的目的
简单来说,就是避免屎山代码,解耦合,优化性能,提高开发效率。
常用GOF设计模式
命令模式 Command Pattern
定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作。
要点:将一组行为抽象为对象,这个对象和其他对象一样可以被存储和传递,从而实现行为请求者与行为实现者之间的松耦合,这就是命令模式。
享元模式 Flyweight Pattern
定义:享元模式,以共享的方式高效地支持大量的细粒度的对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。
要点:享元模式通过共享内蕴状态,区分外蕴状态,有效隔离系统中的变化部分和不变部分。
观察者模式 Observer Pattern
定义:观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
其它:C#直接将其嵌入了语法(event关键字)中。
原型模式 Prototype Pattern
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
要点:实现一个接口,重写一个方法即完成了原型模式。
单例模式 Singleton Pattern
定义:保证一个类只有一个实例,并且提供了访问该实例的全局访问点。
缺点:它会使代码更难理解,更加耦合,并且对并行不太友好。
状态模式 State Pattern
定义:允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。
要点:状态模式用来解决当控制一个对象状态转换的条件表达式过于复杂的情况,它把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
序列型模式 Sequencing Patterns
双缓冲模式 Double Buffer
定义:双缓冲模式,使用序列操作来模拟瞬间或者同时发生的事情。
其它:双缓冲模式常用来做帧缓冲区交换。
游戏循环模式 Game Loop
定义:游戏循环模式,实现游戏运行过程中对用户输入处理和时间处理的解耦。
要点:游戏循环在游戏过程中持续运转。每循环一次,它非阻塞地处理用户的输入,更新游戏状态,并渲染游戏。它跟踪流逝的时间并控制游戏的速率。
更新方法 Update Method
定义:更新方法,通过每次处理一帧的行为来模拟一系列独立对象。
要点:在游戏中保持游戏对象的集合。每个对象实现一个更新方法,以处理对象在一帧内的行为。每一帧中,游戏循环对集合中的每一个对象进行更新。
行为型模式 Behavioral Patterns
字节码模式 Bytecode
定义:字节码模式,将行为编码为虚拟机器上的指令,来赋予其数据的灵活性。从而让数据易于修改,易于加载,并与其他可执行部分相隔离。
子类沙箱模式 Subclass Sandbox
定义:用一系列由基类提供的操作定义子类中的行为。
要点:基类定义抽象的沙箱方法和几个提供操作的实现方法,将他们设为protected,表明它们只为子类所使用。每个推导出的沙箱子类用提供的操作实现了沙箱方法。
类型对象模式 Type Object
定义:创造一个类A来允许灵活的创造新的类,而类A的每个实例都代表了不同类型的对象。
要点:定义类型对象类与有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。每种有类型的对象保存描述它类型的对类型对象的引用。
解耦型模式 Decoupling Patterns
组件模式 Component
定义:允许单一的实体跨越多个领域,无需这些领域彼此耦合。
要点:在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器。
事件队列模式 Event Queue
定义:事件队列模式,对消息或事件的发送与处理进行时间上的解耦。
要点:在先入先出的队列中存储一系列通知或请求。发送通知时,将请求放入队列并返回。处理请求的系统在稍晚些的时候从队列中获取请求并进行处理。这样就解耦了发送者和接收者,既静态又及时。
服务定位模式 Service Locator
定义:提供服务的全局接入点,而不必让用户和实现它的具体类耦合。
要点:服务类定义了一堆操作的抽象接口。具体的服务提供者实现这个接口。分离的服务定位器提供了通过查询合适的提供者,获取服务的方法,同时隐藏了提供者的具体细节和需要定位它的进程。
优化型模式 Optimization Patterns
数据局部性模式 Data Locality
定义:合理组织数据,充分使用CPU的缓存来加速内存读取。
要点:现代的CPU有缓存来加速内存读取,其可以更快地读取最近访问过的内存毗邻的内存。基于这一点,我们通过保证处理的数据排列在连续内存上,以提高内存局部性,从而提高性能。
脏标识模式 Dirty Flag
定义:将工作延期至需要其结果时才去执行,以避免不必要的工作。
要点:当前有一组原始数据随着时间变化而改变。由这些原始数据计算出目标数据需要耗费一定的计算量。这个时候,可以用一个脏标识,来追踪目前的原始数据是否与之前的原始数据保持一致,而此脏标识会在被标记的原始数据改变时改变。那么,若这个标记没被改变,就可以使用之前缓存的目标数据,不用再重复计算。反之,若此标记已经改变,则需用新的原始数据计算目标数据。
对象池模式 Object Pool
定义:放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率。
要点:可以轻易地创建和销毁对象,而不必每次都分配内存或其他资源。
空间分区模式 Spatial Partition
定义:将对象存储在基于位置组织的数据结构中,来有效的定位对象。
要点:空间分区模式在需要大量存储活跃、移动的游戏物体,和静态的美术模型的游戏中比较常用。因为复杂的游戏中不同的内容有不同的空间划分。