0%

意图

Memento是行为模式的一种,他允许你在不暴露对象内部结构的情况下捕获其内部状态,以便稍后对象可以返回到这个状态。

问题

假设你在写一个文本编辑器。核心逻辑放在Editor主类中。另外一些特性,像文本格式化,内联图像等,放在不同的命令类中。

你决定让用户的操作变得可逆。换句话讲,要增加“撤销”功能。为了实现它,你需要在执行任何操作前保存Editor的状态。之后,如果用户决定还原他的一些操作,程序要从历史中拿出快照并恢复Editor到过去状态。

阅读全文 »

意图

Command(命令)是一种行为模式,让你可以把请求转换到单独的对象,可以用来把不同的请求参数化,排队或者记录请求,并且支持撤销操作。

问题

假设你在做一个新的文本编辑器。你创建了一个Button类,可以被用做工具栏的按钮,也可以用作对话框的通用按钮。

这些按钮看起来很像,但是它们做不同的事情。此时我们要把针对不同按钮点击的处理代码放在哪里呢?简单的解决方法是为每个按钮创建一个Button的子类,然后把处理点击事件的代码放到子类中。

但是这么做的缺点很明显。首先,你创建了许多子类。其次,GUI代码依赖了易变的业务逻辑代码。

阅读全文 »

意图

责任链(Chain Of Responsibility)是一种行为模式,通过给多个对象一个机会去处理请求的的方式来避免请求发送者和接受者的耦合。责任链接收对象并且沿着链条传递它,直到一个对象来处理它。

问题

假设你在做一个订单系统。你第一个任务就是限制用户对系统的访问,只有已经授权的用户可以创建订单。另外,一些用户拥有管理员权限,可以访问全部的订单。

你意识到这些检查必须顺序处理。程序能够在任何时候对用户进行尝试认证,只要用户的证书被请求传递。但是,如果未能对用户进行身份验证,则无法检查用户的权限。

阅读全文 »

意图

Singleton是创建模式的一种,让你可以确保一个类只有一个实例,并为此实例提供一个全局访问点。

问题

Singleton同时解决了两个问题(违反了单一职责原则):

  1. 确保一个类只有一个实例。最常见原因是控制一些共享资源,比如,数据库。

    假设你已经创建了一个新对象,不久,又尝试创建一个新的。在这种秦光下,你想要老的那个对象而不是新创建一个实例。

    它不能通过正常的构造方法完成,因为在设计上每个构造方法总是返回一个新对象。

    阅读全文 »

目的

Prototype(也叫做Clone)是创建型模式的一种,允许你通过复制现有的对象来生成新的对象,而不会影响现有对象的内部。

问题

你有一个对象并且想要创建一个副本。你该怎么做?首先,你需要创建同样class的一个新对象。然后,你必须遍历源对象的所有字段并把值拷贝到新对象中。

但是这么做有一个问题。不是所有对象都可以通过这种方式被拷贝。一些对象拥有无法从外部访问的私有字段。

这么做还有另外的问题。因为你必须知道对象类能够被遍历的所有字段,你的代码需要依赖你要拷贝对象的类。在你仅知道拷贝对象的接口时无法拷贝对象。

阅读全文 »

意图

Builder是创建模式的一种,让你可以使用相同的构建过程生成不同类型和对象的表示形式。BUilder允许一步一步构建复杂对象。

问题

假设有一个复杂对象需要一步一步的初始化许多字段和嵌套对象。这些代码通常放在一个有很多参数的构造方法中,或者更糟糕,分散在客户端代码中。

比如,让我们考虑下如何创建一个House对象。创建一个简单的房子,你需要盖四面墙,安装一个门和两个窗户,构建房顶。但是,如果你想要一个更大,更亮堂,并且有后院和其他好吃的东西的房子呢?

阅读全文 »

目的

Abstract Factory是创建模式的一种,让你在没有指定具体类的情况下生产相关对象的系列。

问题

假设你在写一个家具店的模拟器。你的代码由以下构成:

  1. 相关产品的系列,像:Chair + Sofa + CoffeeTable。

  2. 系列的几个变种。比如,产品Chair + Sofa + Coffee + CoffeeTable可以有这些变种:IKEA,VictorianStyle,ArtDeco。

你需要有种方式创建个性化的家具对象,以便它们能够匹配相同系列中的其他对象。在没有匹配到家具时,客户会感到失望。

另外,你不想在添加新产品或者产品系列时改变已经存在的代码。家具供应商常常会更新他们的目录,并且你不想每次在供货商改目录时修改你的核心代码。

阅读全文 »

目的

Factory Method是创建模式的一种,他在父类中提供一个用来创建对象的接口,但是允许子类修改创建对象的类型。

问题

假设你有一个后勤管理应用。应用的第一个版本只需要处理卡车这种运输方式,所以,你有一个Truck类。

不久,你的应用很受欢迎,你收到了许多需求,包括水运。

阅读全文 »

目的

结构设计模式使的我们简单快速的建立类的层级及不同类之间的关系,明确不同层级间的责任和边界,让各个模块、系统间相互独立并很好的协作。

概览

Adapter模式

适配器的目的是使不兼容接口间的可正常进行协作,它允许我们新增接口。主要用来解决下面两个问题:

  • 接口间输入输出不匹配的问题,适配器在无法相互直接使用的接口间加入中间转换层,对数据格式进行转换,使接口间可以顺利协作。

  • 当你需要复用几个已经存在的类,但是它们缺少一些常用的功能。并且你无法在父类中添加这些功能,因为他是闭源或者被其他代码使用的。可以把这些缺少的功能放到新建的适配器中。

阅读全文 »

目的

Flyweight是结构模式的一种,通过在多个对象见共享对象状态的通用部分而不是让各个对象独自持有的方式来让你在可用的RAM中装入更多的对象。

问题

在长时间工作后想要找些乐趣,你决定写一个简单的视频游戏。玩家能够在地图上移动并且可以相互射击。你决定实现一个真实的粒子系统并让它称为这个游戏的特性。子弹,导弹和爆炸产生的碎片应该到处飞舞并且能够给玩家分配经验。

过了一会,你最后一次提交代码并且把游戏发给了你的朋友,希望他能够立马玩起来。尽管游戏在你电脑上完美运行,但是你的朋友却不能玩起来。这个游戏总是在他的电脑上运行一会儿就崩溃。

在你看了日之后,发现是因为RAM不足导致了游戏崩溃。这个看起来和你的粒子系统有关。

每一个例子由一个包含和丰富数据的对象表示。在某一刻,当团战达到高潮,可用的RAM无法装入新创建的粒子,此时程序就崩溃了。

阅读全文 »