
GoF设计模式
这是设计模式专栏的第一期,主要介绍著名的四人帮总结的23种设计模式。
DiaX
NEU软院大水逼一枚
展开
-
(23)行为型模式——访问者
行为型模式——访问者(Visitor)目录行为型模式——访问者(Visitor)问题背景解决方案效果缺陷相关模式实现问题背景当希望在不改变类的前提下增加新的操作时,考虑使用访问者。假设我们自己实现了一个线性表和一个链表,它们已经有了基本的增删改查操作。现在我们想加入排序功能和映射功能(将表中的每个元素x变为f(x)),但又不想直接改原有的类。解决方案为了不修改原有的类,我们只能把新功能加...原创 2020-02-24 00:15:15 · 307 阅读 · 0 评论 -
(22)行为型模式——模板方法
行为型模式——模板方法(Template Method)目录行为型模式——模板方法(Template Method)问题背景解决方案效果缺陷相关模式实现问题背景当一些算法都遵循同一套流程,只有部分细节不同时,考虑使用模板方法。现在有一套窗口,它们在关闭时都执行这样一系列操作:重置窗口状态,播放关闭动画,将窗口设为disabled状态(不工作,但仍然在内存中)。在这三个步骤中,重置窗口状态是一...原创 2020-02-21 21:15:58 · 164 阅读 · 0 评论 -
(21)行为型模式——策略
行为型模式——策略(Strategy)目录行为型模式——策略(Strategy)问题背景解决方案效果缺陷相关模式实现问题背景当需要从一系列算法中动态选择一个时,考虑使用策略。在大部分有伤害系统的游戏中,都会区分物理伤害和魔法伤害。思考如下场景:单位A攻击单位B,发出抛射体P,P与B碰撞后调用MakeDamage方法造成伤害。这个方法的实现方式就是讨论的重点:是直接在方法内部实现伤害计算逻辑,...原创 2020-02-19 10:45:06 · 1567 阅读 · 0 评论 -
(20)行为型模式——状态
行为型模式——状态(State)目录行为型模式——状态(State)问题背景解决方案效果缺陷相关模式实现问题背景当希望对象的行为会随着状态改变而改变时,考虑使用状态。想想LoL,玩家可以让他们操控的英雄移动、攻击、使用技能等,而英雄在一局游戏里会有很多种状态,比如正常、眩晕、沉默、死亡…英雄在不同状态下对不同指令的响应方式可能会有不同。正常状态下英雄会响应任何指令,而眩晕状态下则只响应特定的...原创 2020-02-17 10:54:28 · 478 阅读 · 0 评论 -
(19)行为型模式——观察者
行为型模式——观察者(Observer)目录行为型模式——观察者(Observer)问题背景解决方案效果缺陷相关模式实现问题背景当需要一种一对多的通知机制时,考虑使用观察者。在一些游戏中,策划出于某种目的会把玩家的属性划分成一级属性(力量、智力、体质等)和二级属性(生命、魔法、攻击力、防御力等)。在其他因素(装备、修炼、BUFF等)不变的条件下,二级属性是一级属性的函数。因此,在一级属性发生...原创 2020-02-16 01:03:34 · 605 阅读 · 0 评论 -
(18)行为型模式——备忘录
行为型模式——备忘录(Memento)目录行为型模式——备忘录(Memento)问题背景解决方案效果缺陷相关模式实现问题背景当需要在不破坏封装性的前提下将对象的状态储存在外部对象中时,考虑使用备忘录。现在有一个可视化的界面编辑工具,用户能直接拖动预览窗口中的控件来改变控件的位置。如果用户对一次操作不满意,他应该可以撤销本次操作,即让编辑器的状态回滚到这次操作之前。解决方案为了实现撤销操作...原创 2020-02-13 11:04:02 · 260 阅读 · 0 评论 -
(17)行为型模式——中介
行为型模式——中介(Mediator)目录行为型模式——中介(Mediator)问题背景解决方案效果缺陷相关模式问题背景当需要降低多个子系统之间的耦合度时,考虑使用中介。在模块化开发中,多个模块(子系统)需要相互协作完成任务。因此,我们虽然强调要尽量降低模块间的耦合度,但完全没有耦合的系统也是毫无意义的。假设有N个子系统,它们两两之间都需要进行通信。在不作任何设计的情况下,整个系统的复杂度是...原创 2020-02-11 13:44:20 · 279 阅读 · 0 评论 -
(16)行为型模式——迭代器
行为型模式——迭代器(Iterator)目录行为型模式——迭代器(Iterator)问题背景解决方案效果缺陷相关模式实现问题背景当需要重复使用某种规则遍历一个集合时,考虑使用迭代器。现有一整数集合,要求实现三个函数:将其中所有负数打印出来。将其中所有7的倍数打印出来。将其中所有2的幂打印出来。要实现这些功能,必须遍历这个集合。针对这个集合的类型不同,我们会使用不同的遍历规则。如果...原创 2020-02-10 11:20:04 · 270 阅读 · 0 评论 -
(15)行为型模式——解释器
行为型模式——解释器(Interpreter)目录行为型模式——解释器(Interpreter)问题背景解决方案效果缺陷相关模式实现问题背景当需要为某一类问题创建文法并解释执行时,考虑使用解释器。比如要实现一个计算器,根据用户输入的表达式字符串输出表达式的值。在第一个版本中,计算器只实现了四则运算的功能,并且不能使用“(”和“)”,但是在以后的版本中会不断支持新的运算符。解决方案根据以往...原创 2020-02-09 14:08:50 · 229 阅读 · 0 评论 -
(14)行为型模式——命令
行为型模式——命令(Command)目录行为型模式——命令(Command)问题背景解决方案效果相关模式实现问题背景当遇到以下需求时,考虑使用命令:将用户和实际执行请求的对象解耦。支持撤销操作。多种操作对应同一种请求。一个请求执行一串连续操作。命令的应用场景非常广泛,一个不得不提的就是菜单功能。考虑一个菜单,首先,用户只需要在菜单上做同样的操作(选择一个选项)就可以实现各种截然...原创 2020-02-08 12:57:01 · 445 阅读 · 0 评论 -
(13)行为型模式——责任链
结构型模式——责任链(Chain of Responsibility)目录结构型模式——责任链(Chain of Responsibility)问题背景解决方案效果缺陷相关模式实现问题背景当希望让多个对象都有处理请求的机会时,考虑使用责任链。责任链的应用场景比较有限,这里就直接照搬书中的案例了。考虑一个图形用户界面中的上下文有关的帮助机制:用户在不同的界面点击帮助按钮,会显示不同的帮助文档。...原创 2020-02-07 10:44:34 · 288 阅读 · 0 评论 -
(12)结构型模式——代理
结构型模式——代理(Proxy)目录结构型模式——代理(Proxy)问题背景解决方案效果缺陷相关模式实现问题背景当需要监控外界对对象的访问时,考虑使用代理。举个大家都干过的例子哈,在咱这一代小时候,互联网这东西还没这么牛X。你要约女朋友出来,却没有QQ微信电话,只能硬着头皮去她家找。然而开门的不是你女朋友,而是你老丈母娘。老丈母娘问你,叫她宝贝女儿出去干嘛。这时候,要是你说:我们约好要一起写...原创 2020-02-06 10:56:31 · 233 阅读 · 0 评论 -
(11)结构型模式——享元
结构型模式——享元(Flyweight)目录结构型模式——享元(Flyweight)问题背景解决方案效果缺陷相关模式实现问题背景当使用大量细粒度对象,需要提高系统性能时,考虑使用享元。现在我们要为一个RPG游戏设计装备系统,首先根据需求提取出装备类的属性,可能包括:标识符、名称、描述、装备类型、初始属性取值集合、穿戴条件、属性集合、耐久上限、当前耐久、最高强化等级、强化等级……我们会发现这些...原创 2020-02-05 20:43:07 · 314 阅读 · 0 评论 -
(10)结构型模式——门面
结构型模式——门面(Facade)目录结构型模式——门面(Facade)问题背景解决方案效果相关模式问题背景当需要为一个复杂的系统提供简单的接口时,考虑使用门面。现有一个编译器,由Lexer,Parser,Token等类组成,内部结构比较复杂。但编译器完成的唯一功能就是编译源代码,用户大多数情况下也不需要定制功能。解决方案提供一个高层接口,这个接口包含系统的基本功能;系统内部的类同样会暴...原创 2020-02-05 18:45:04 · 220 阅读 · 0 评论 -
(9)结构型模式——装饰器
结构型模式——装饰器(Decorator)目录结构型模式——装饰器(Decorator)问题背景解决方案效果缺陷相关模式实现问题背景当需要动态地扩展一个对象时,可以考虑使用装饰器。用RPG游戏中烂大街的宝石镶嵌功能举例:现有一个装备类,在设计之初并没有考虑镶嵌功能,如果要在类内部加入镶嵌逻辑,就必须修改原有代码。而修改原有代码很容易引起回归错误,尤其是进行这种大规模改动的时候。解决方案由...原创 2020-02-05 11:42:16 · 280 阅读 · 0 评论 -
(8)结构型模式——复合
结构型模式——复合(Composite)目录结构型模式——复合(Composite)问题背景解决方案效果缺陷相关模式实现问题背景当希望用某种统一的方式表示一个树形结构,并屏蔽内部实现,提供统一接口时,考虑使用复合模式(也叫组合模式)。复合模式的典型应用场景就是界面,界面包括文字、按钮等基本控件,还解决方案效果缺陷相关模式实现...原创 2020-02-04 15:02:37 · 450 阅读 · 0 评论 -
(7)结构型模式——桥接
结构型模式——桥接(Bridge)目录结构型模式——桥接(Bridge)问题背景解决方案效果缺陷相关模式实现问题背景当对象有两个可能的扩展维度时,应该考虑使用桥接。现在我们对动物进行建模,将它们从两个维度分为陆生生物和海洋生物、植食动物和肉食动物。根据语义,这四种动物和动物这个抽象概念之间均为is-a的关系,因此我们直接提取一个动物接口IAnimal,并让四个实现类都直接实现IAnimal。...原创 2020-02-04 10:19:23 · 368 阅读 · 0 评论 -
(6)结构型模式——适配器
结构型模式——适配器(Adapter)目录结构型模式——适配器(Adapter)问题背景解决方案效果缺陷相关模式实现问题背景当需要将一个接口转换成另一个具有相同参数列表和返回值的接口时,使用适配器。适配器的使用场景一般是移植类库,旧版本类库的接口与新版本的不兼容,因此需要使用适配器来转换接口。假设现有一个排序算法库,通过ISort接口中的Sort方法运行,要将这个库移植到另一个库中,新库的接...原创 2020-02-03 14:41:30 · 346 阅读 · 1 评论 -
(5)创建型模式——单例
创建型模式——单例(Singleton)目录创建型模式——单例(Singleton)问题背景解决方案效果缺陷相关模式实现问题背景当某个类的实例只需要有一个或只能有一个时,通常有两种做法。一是直接使用静态类,这是一种面向过程的做法,它的优点是实现和使用比较方便,但这种做法无法享受到面向对象机制带来的好处;另一种做法是使用单例类,将构造方法设为私有并在内部保证全局只有一个实例。假设在一局LOL中...原创 2020-02-03 11:41:53 · 1520 阅读 · 0 评论 -
(4)创建型模式——原型
创建型模式——原型(Prototype)目录创建型模式——原型(Prototype)问题背景解决方案效果缺陷相关模式实现问题背景当希望批量生成有状态对象时,应该考虑使用原型模式。假设有一种怪物,它有生命值、魔法值、攻击力、防御力等大量属性,可以一次分裂出十个与自己完全相同的怪物。如果直接实现这个逻辑,代码会是这样的:var monster = new Monster();monster....原创 2020-02-02 13:54:52 · 414 阅读 · 0 评论 -
(3)创建型模式——工厂方法
创建型型模式——工厂方法(Factory Method)目录创建型型模式——工厂方法(Factory Method)问题背景解决方案效果缺陷相关模式实现问题背景为了引出问题,我们首先介绍一种未被纳入GoF设计模式的模式:简单工厂。这个模式是为了将某个接口的某个实现的创建和表示分离而存在的。听起来似乎有点晦涩,下面举个例子。在LOL的载入过程中,游戏要根据玩家在房间的选择来创建对应的英雄。由于...原创 2020-02-02 13:01:07 · 436 阅读 · 0 评论 -
(2)创建型模式——生成器
创建型模式——生成器(Builder)目录创建型模式——生成器(Builder)问题背景解决方案效果缺陷相关模式实现问题背景当创建一个可以明显划分为多个可配置部件的复杂对象时,可以考虑使用生成器。比如我们现在要创建一台电脑,电脑有处理器、显卡和硬盘三个可配置部件。创建一台高配电脑和一台低配电脑,如果不使用生成器,代码是这样的:var high = new Computer();high....原创 2020-02-01 19:45:23 · 319 阅读 · 0 评论 -
(1)创建型模式——抽象工厂
抽象工厂目录抽象工厂问题背景解决方案效果缺陷实现问题背景当希望能够替换和扩展一族相关类的实现来给予程序定制性时,可以使用抽象工厂。最常见的需求就是界面换肤:用户可以自由选择Windows或Mac风格的界面,并且在以后的版本迭代中可能推出更多款式。在这种需求下,如果把客户端实现成这样就会造成很多麻烦:这是典型的“非OO”做法,在OOP中,要实现对象行为的动态切换,应该使用多态,而不是将各种...原创 2020-02-01 08:43:53 · 444 阅读 · 0 评论