读书笔记1
一、设计模式的分类
设计模式的分类方式一:创建型(creational)、结构型(structural)、行为型(behavioural)。
创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。
设计模式的分类方式二:用于类、用于对象。
类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时确定。对象模式处理对象间的关系,这些关系在运行时是可以变化的,更具动态性。
二、23个设计模式
1、创建型类模式
创建型类模式将对象的部分创建工作延迟到子类。
Factory Method
Factory Method定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
可变的方面:被实例化的子类。
一些思考:一个Creator类中提供CreatePlayerCar和CreateAICar两种方法,ConcreteCreator中决定具体返回的对象类型。其实这是一种退化的Factory Method;BehaviourSystem中通常有很多种行为,可以通过模版化Creator来避免子类的创建,同时又可以产生不同的类,也可以将类的Id作为参数传入,决定创建哪个类型的子类。
2、创建型对象模式
创建型对象模式将对象的部分创建工作延迟到另一个对象中。
Abstract Factory
提供一个创建一些类相关或相互依赖对象的接口,而无需指定他们的具体类。
可变的方面:产品对象家族。
一些思考:在AbstractFactory的具体实现类中实现对每种ConcreteProduct的创建方法;在Client的代码中,所有的地方都使用AbstractFactory类和AbstractProduct类,就可以做到通过切换AbstractFactory的具体类实现对整个系统中使用的ConcreteProduct的一次性全部切换。 在游戏开发中最典型的应用就是不同操作系统间整个UI风格的切换。
Builder
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
可变的方面:如何创建一个组合对象。
一些思考:车辆游戏中,可以实现一个CarBuilder类扮演一个Director,其中有WheelBuilder、SuspensionBuilder等ConcreteBuilder。通过这种方法复杂的对象的构建过程被分离。同时还可以增加前驱车Builder、后驱车Builder、四驱车Builder来更加细化构建过程。
Prototype
用原型实例指定创建对象的种类,并通过拷贝这个原型来创建新的对象。
可变的方面:被实例化的类
一些思考:对象池技术;游戏UI展示界面中,有很多Item,每个Item都是相同的,只不过展示的具体信息不一样,可以利用Prototype,使用clone的方法获得,修改具体的展示信息后展示。
Singleton
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
可变的方面:一个类的唯一实例。
一些思考:最重要的一个方法是Get方法,获取这个单例,比如AISystem::Get()。
3、结构型类模式
结构型类模式使用继承机制来组合类。
Adapter(类)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式是的原本由于接口不兼容而不能一起工作的那些类可以一起工作。
可变的方面:对象的接口
一些思考:类适配器使用多重继承对一个接口与另一个接口进行匹配。Adapter类使用公有方式继承Target类,并且用私有方式继承Adaptee类。Adapter类应该是Target的子类而不是Adaptee的子类型。
4、结构型对象模式
结构型对象模式描述了对象的组装方式。
Adapter(对象)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式是的原本由于接口不兼容而不能一起工作的那些类可以一起工作。
可变的方面:对象的接口。
一些思考:对象匹配器依赖与对象组合。开发中用到的一些第三方库可以用这种方法接入到现有的系统中。
Bridge
将抽象部分与它的实现部分分离,使它们都可以独立的演化。
可变的方面:对象的实现。
一些思考:pImpl手法。Abstraction中维护一个指向Implementor类型对象的指针。Abstraction将client的请求转发给它的Implementor对象。
Composite
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和组合对象使用具有一致性。
可变的方面:一个对象的结构和组成。
一些思考:车辆的部件Component抽象接口有update方法;车辆部件的叶子节点Leaf,比如一个轮胎,实现update方法;车辆的包含子部件的组合部件Composite,实现update方法,并调用子部件的update,比如底盘组合部件。就可以把Leaf和Composite统一对待。
Decorator
动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式化生成子类的方式更为灵活。
可变的方面:对象的职责,不生成子类。
一些思考:例如有些车是有尾翼的,有些车没有。那么就可以实现一个基本的车辆类和一个车辆尾翼装饰器,对于有尾翼的车利用车辆尾翼装饰器添加车辆尾翼的一些功能。同时似乎可以实现一系列化的尾翼装饰器,也许在车辆的改装系统中会有奇效。
Facade
为子系统中的一组接口提供一个一致的界面,Facade模式定义类一个高层接口,这个接口使得这一子系统更加容易使用。
可变的方面:一个子系统的接口。
一些思考:客户程序通过发送请求给Facade的方式与子系统通信,Facade将这些消息转发给适当的子系统对象。主要任务是为一般情况简化接口。
Flyweight
运用共享技术有效地支持大量细粒度的对象。
可变的方面:对象的存储开销。
一些思考:内部状态存储于flyweight中,包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。而外部状态取决于flyweight场景,并根据场景而变化,因此不可共享。比如一些车辆的配置参数,在系统运行时可以共享内存中的同一份数据。
Proxy
为其他对象提供一个代理以控制对这个对象的访问。
可变的方面:如何访问一个对象;该对象的位置。
一些思考:copy on write技术,用代理延迟拷贝过程,只有当这个对象被修改时才对它进行拷贝。
5、行为型类模式
行为类模式使用继承描述算法和控制流。
Interpreter
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
可变的方面:一个语言的文法及解释。
一些思考:似乎行为树的编辑器可以用这个方式实现配置,即行为树文件解释器。
Template Method
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。
可变的方面:算法中的某些步骤。
一些思考:创建一场游戏可以有固定的流程,doReady()->doStart()->doFinish()->doClear()这四个固定的步骤,则可以在抽象类中定义这样的流程原语操作;具体类代表不同的游戏玩法,实现特定子步骤的过程。
6、行为型对象模式
行为型对象模式描述了一组对象怎样协作完成单个对象所无法完成的任务。
Chain of Responsibility
解除请求的发送者和接受者之间的耦合,使多个对象有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
可变的方面:满足一个请求的对象。
一些思考:提交请求的客户不直接引用最终响应它的对象。
Command
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消操作。
可变的方面:何时、怎样满足一个请求。
一些思考:可以把游戏中的各种跳转方式封装成为command,这样就可以在多处复用。例如 返回大厅的命令,可以放置在多个UI按钮的回调中。
Iterator
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
可变的方面:如何遍历、访问一个聚合的各元素。
一些思考:暂无。
Mediator
用一个中介对象来封装一些类的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
可变的方面:对象间怎样交互、和谁交互。
一些思考:子系统对其他子系统的调用全部通过调用中介者的接口来实现。例如AI系统中的行为系统想要知道状态机中的状态信息,不应该通过BehaviourSystem直接去引用StateMachine,而应该去访问中介者AIMediator来实现松耦合。
Memento
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
可变的方面:一个对象中哪些私有信息存放在该对象之外,以及在什么时候进行存储。
一些思考:极限竞速地平线4里面有个功能,按Y键可以回退游戏状态,哈哈,个人很喜欢这个功能。可能就是实现了一个带序列标签的备忘录系统,不断存储另一个对象(车辆和整个世界)的在某个瞬间的内部状态,然后再逆向恢复状态出来。
Observer
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
可变的方面:多个对象依赖于另外一个对象,而这些对象又如何保持一致。
一些思考:发布-订阅模式。UE4引擎里面处处都充满着发布和订阅。
State
允许对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
可变的方面:对象的状态。
一些思考:从更高的层面看状态机。
Strategy
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
可变的方面:算法
一些思考:车辆AI中不同的种类的弯道采用不同的过弯策略,可以封装成为策略模式,从而消除大量的条件语句。似乎还可以和状态模式结合,实现不同弯道状态采用不同的过弯策略,而client对此过程不需要了解。
Visitor
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
可变的方面:某些可作用于一个(组)对象上的操作,但不能修改这些对象的类。
一些思考:双分发技术。得到执行的操作不仅取决于Visitor的类型还取决于它访问的Element的类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署