
设计模式
文章平均质量分 71
爱橙子的OK绷
时刻准备着。。。
展开
-
设计模式总结:概念、原则、23种模式分析
1、什么是设计模式设计模式从本质上讲,是针对过去某种经验的总结。每种设计模式都是为了在特定条件下去解决某种问题。设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。它是可复用面向对象软件的基础。设计模式解决的是系统设计问题,设计模式是“术”,设计模式背后的用意才是“道”。GoF提出了23中设计模式,是对日常用到原创 2016-05-29 23:31:17 · 3712 阅读 · 1 评论 -
对象的克隆——原型模式(三):浅克隆,深克隆
7.4 带附件的周报通过引入原型模式,Sunny软件公司OA系统支持工作周报的快速克隆,极大提高了工作周报的编写效率,受到员工的一致好评。但有员工又发现一个问题,有些工作周报带有附件,例如经理助理“小龙女”的周报通常附有本周项目进展报告汇总表、本周客户反馈信息汇总表等,如果使用上述原型模式来复制周报,周报虽然可以复制,但是周报的附件并不能复制,这是由于什么原因导致的呢?如何才能实现周报和附件的同时复转载 2016-01-12 21:15:07 · 1253 阅读 · 0 评论 -
对象的克隆——原型模式(二):工作周报的原型模式解决方案
7.3 完整解决方案Sunny公司开发人员决定使用原型模式来实现工作周报的快速创建,快速创建工作周报结构图如图7-3所示: 在图7-3中,WeeklyLog充当具体原型类,Object类充当抽象原型类,clone()方法为原型方法。 WeeklyLog类的代码如下所示://工作周报WeeklyLog:具体原型类,考虑到代码的可读性和易理解性,只列出部分与模式相关的核心代码class Weekly转载 2016-01-12 15:05:33 · 826 阅读 · 0 评论 -
实现对象的复用——享元模式(三):围棋棋子的解决方案
14.3 完整解决方案为了节约存储空间,提高系统性能,Sunny公司开发人员使用享元模式来设计围棋软件中的棋子,其基本结构如图14-4所示:在图14-4中,IgoChessman充当抽象享元类,BlackIgoChessman和WhiteIgoChessman充当具体享元类,IgoChessmanFactory充当享元工厂类。完整代码如下所示:import java.util.*; //围棋棋子类转载 2016-01-29 11:04:03 · 1489 阅读 · 0 评论 -
对象的克隆---原型模式(一):大同小异的工作周报,原型模式概述
孙悟空可以用猴毛根据自己的形象,复制(又称“克隆”或“拷贝”)出很多跟自己长得一模一样的“身外身”来。在设计模式中也存在一个类似的模式,可以通过一个原型对象克隆出多个一模一样的对象,该模式称之为原型模式。7.1 大同小异的工作周报Sunny公司的开发人员通过对问题进行仔细分析,决定按照如下思路对工作周报模块进行重新设计和实现: (1)除了允许用户创建新周报外,还允许用户将创建好的周报保存为模板;转载 2016-01-12 10:59:51 · 614 阅读 · 0 评论 -
实现对象的复用——享元模式(二):享元模式概述(下)
享元模式结构较为复杂,一般结合工厂模式一起使用,在它的结构图中包含了一个享元工厂类,其结构图如图14-3所示:在享元模式结构图中包含如下几个角色: ● Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。 ● ConcreteFlyweight(转载 2016-01-28 19:57:28 · 473 阅读 · 0 评论 -
实现对象的复用——享元模式(一):享元模式概述(上)
在软件系统中,有时候也会存在资源浪费的情况,例如在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高,内存属于计算机的“稀缺资源”,不应该用来“随便浪费”,那么是否存在一种技术可以用于节约内存使用空间,实现对这些相同或者相似对象的共享访问呢?答案是肯定,这种技术就是我们本章将要学习的享元模式。14.1 围棋棋子的设计Sunny软件公司欲开发一个围棋软件,其转载 2016-01-28 16:51:07 · 496 阅读 · 0 评论 -
确保对象的唯一性——单例模式 (三):饿汉式单例与懒汉式单例
3.4 饿汉式单例与懒汉式单例的讨论Sunny公司开发人员使用单例模式实现了负载均衡器的设计,但是在实际使用中出现了一个非常严重的问题,当负载均衡器在启动过程中用户再次启动该负载均衡器时,系统无任何异常,但当客户端提交请求时出现请求分发失败,通过仔细分析发现原来系统中还是存在多个负载均衡器对象,导致分发时目标服务器不一致,从而产生冲突。为什么会这样呢?Sunny公司开发人员百思不得其解。现在我们对负转载 2016-01-11 09:45:42 · 461 阅读 · 0 评论 -
确保对象的唯一性——单例模式 (五):单例模式总结
3.6 单例模式总结单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架中都得以广泛应用。1.主要优点(1) 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 (2) 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。转载 2016-01-11 21:47:56 · 372 阅读 · 0 评论 -
确保对象的唯一性——单例模式 (二):负载均衡器的设计与实现
3.3 负载均衡器的设计与实现Sunny软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高系统的整体处理能力,缩短响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则转载 2016-01-10 23:15:30 · 1621 阅读 · 0 评论 -
深入浅出外观模式(三):抽象外观类,外观模式效果与适用场景
4. 抽象外观类在标准的外观模式结构图中,如果需要增加、删除或更换与外观类交互的子系统类,必须修改外观类或客户端的源代码,这将违背开闭原则,因此可以通过引入抽象外观类来对系统进行改进,在一定程度上可以解决该问题。在引入抽象外观类之后,客户端可以针对抽象外观类进行编程,对于新的业务需求,不需要修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到转载 2016-01-27 09:29:52 · 1758 阅读 · 0 评论 -
对象的克隆——原型模式(四):原型管理器的引入和实现,原型模式总结
7.5 原型管理器的引入和实现原型管理器(Prototype Manager)是将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得。在原型管理器中针对抽象原型类进行编程,以便扩展。其结构如图7-8所示: 下面通过模拟一个简单的公文管理器来介绍原型管理器的设计与实现:我转载 2016-01-12 23:21:40 · 1467 阅读 · 0 评论 -
实现对象的复用——享元模式(四):带外部状态的解决方案
14.5 带外部状态的解决方案Sunny软件公司开发人员通过对围棋棋子进行进一步分析,发现虽然黑色棋子和白色棋子可以共享,但是它们将显示在棋盘的不同位置,如何让相同的黑子或者白子能够多次重复显示且位于一个棋盘的不同地方?解决方法就是将棋子的位置定义为棋子的一个外部状态,在需要时再进行设置。因此,我们在图14-4中增加了一个新的类Coordinates(坐标类),用于存储每一个棋子的位置,修改之后的结转载 2016-01-29 22:31:06 · 1125 阅读 · 0 评论 -
代理模式(四):代理模式效果与适用场景
15.7 代理模式效果与适用场景代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。15.7.1 模式优点代理模式的共同优点如下: (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。 (2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代转载 2016-02-25 15:24:48 · 1112 阅读 · 0 评论 -
代理模式(三):远程代理,虚拟代理,缓冲代理
15.4 远程代理远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求。远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用。远程代理示意图转载 2016-02-24 11:43:41 · 3285 阅读 · 0 评论 -
代理模式(二):代理模式应用实例(收费商务信息查询系统)
15.3 代理模式应用实例下面通过一个应用实例来进一步学习和理解代理模式。 1、 实例说明 ———————————————————————————————— 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下: (1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统; (2) 在进行商务信息查询时系统需要记录查询日志,以便根据转载 2016-02-21 11:07:39 · 2397 阅读 · 0 评论 -
代理模式(一):代理模式概述,代理模式结构与实现
代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。15.1 代理模式概述近年来,代购已逐步成为电子商务的一个重要分支。何转载 2016-02-16 16:58:53 · 564 阅读 · 0 评论 -
实现对象的复用——享元模式(五):单纯、复合享元模式,享元模式总结
14.5 单纯享元模式和复合享元模式标准的享元模式结构图中既包含可以共享的具体享元类,也包含不可以共享的非共享具体享元类。但是在实际使用过程中,我们有时候会用到两种特殊的享元模式:单纯享元模式和复合享元模式,下面将对这两种特殊的享元模式进行简单的介绍:1.单纯享元模式在单纯享元模式中,所有的具体享元类都是可以共享的,不存在非共享具体享元类。单纯享元模式的结构如图14-6所示: 2.复合享元模式将一转载 2016-02-16 16:04:36 · 2257 阅读 · 1 评论 -
不兼容结构的协调——适配器模式(四):缺省适配器,适配器模式总结
9.6 缺省适配器缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。缺省适配器模式的定义如下:缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接转载 2016-01-15 10:54:09 · 859 阅读 · 0 评论 -
不兼容结构的协调——适配器模式(三):类适配器,双向适配器
9.4 类适配器除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系,类适配器模式结构如图9-5所示: 根据类适配器模式结构图,适配器类实现了抽象目标类接口Target,并继承了适配者类,在适配器类的request()方法中调转载 2016-01-15 10:16:48 · 2287 阅读 · 0 评论 -
不兼容结构的协调——适配器模式(二):算法库适配器模式解决方案
9.3 完整解决方案Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图9-4所示:在图9-4中,ScoreOperation接口充当抽象目标,QuickSort和BinarySearch类充当适配者,OperationAdapter充当适配器。完整代码如下所示://抽象成绩操作类:目标接口interface ScoreOperation { public in转载 2016-01-14 17:19:59 · 364 阅读 · 0 评论 -
不兼容结构的协调——适配器模式(一):适配器模式概述
我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,如图9-1所示:在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之为适配器的角色来协调这些存在不兼容的结构,这种设计方案即为适转载 2016-01-14 16:24:11 · 454 阅读 · 0 评论 -
复杂对象的组装与创建——建造者模式(三):Director的讨论,模式总结
8.4 关于Director的进一步讨论指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象。下面我们讨论几种Director的高级应用方式:1.省略Director在有些情况下,为了简化系统结构,可以将Director和抽象转载 2016-01-14 09:58:08 · 805 阅读 · 0 评论 -
复杂对象的组装与创建——建造者模式(二):建造者模式解决方案
8.3 完整解决方案Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图8-3所示:在图8-3中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者,Actor充当复杂产品。完整代码如下所示://Actor角色类:复杂产品,考虑到代码的可读性,只列出部分成员转载 2016-01-13 14:34:50 · 642 阅读 · 0 评论 -
复杂对象的组装与创建——建造者模式(一):游戏角色设计,模式概述
没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。8.1 游戏角色设计Sunny软件公司游戏开发小组决定开发一款名为《S转载 2016-01-13 10:34:39 · 1509 阅读 · 0 评论 -
确保对象的唯一性——单例模式 (一):动机,概述
3.1 单例模式的动机对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务管理器,如图3-1所示,我们可以做一个这样的尝试,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”,看能否打开多个任务管理器窗口?如果你的桌面出现多个任务管理器,我请你吃饭(注:电脑中毒或私自修改Windows内核者除外)。通常情况下,无论我们启动任务管理多少次,转载 2016-01-07 22:48:43 · 536 阅读 · 0 评论 -
工厂三兄弟之抽象工厂模式(五):抽象工厂模式总结
5 “开闭原则”的倾斜性Sunny公司使用抽象工厂模式设计了界面皮肤库,该皮肤库可以较为方便地增加新的皮肤,但是现在遇到一个非常严重的问题:由于设计时考虑不全面,忘记为单选按钮(RadioButton)提供不同皮肤的风格化显示,导致无论选择哪种皮肤,单选按钮都显得那么“格格不入”。Sunny公司的设计人员决定向系统中增加单选按钮,但是发现原有系统居然不能够在符合“开闭原则”的前提下增加新的组件,原因转载 2016-01-05 22:25:21 · 420 阅读 · 0 评论 -
工厂三兄弟之抽象工厂模式(四):界面皮肤库解决方案
4 完整解决方案Sunny公司开发人员使用抽象工厂模式来重构界面皮肤库的设计,其基本结构如图6所示: 在图6中,SkinFactory接口充当抽象工厂,其子类SpringSkinFactory和SummerSkinFactory充当具体工厂,接口Button、TextField和ComboBox充当抽象产品,其子类SpringButton、SpringTextField、SpringComboBo转载 2016-01-05 22:00:25 · 815 阅读 · 0 评论 -
工厂三兄弟之简单工厂模式(三)
3 完整解决方案为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: 在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。!!!完整代码如下所示://抽象图表接口:抽象产品类inte转载 2016-01-02 21:33:33 · 341 阅读 · 0 评论 -
工厂三兄弟之简单工厂模式(二)
2 简单工厂模式概述简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个转载 2016-01-02 00:18:59 · 466 阅读 · 0 评论 -
工厂三兄弟之简单工厂模式(一)
工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件转载 2016-01-01 23:30:23 · 401 阅读 · 0 评论 -
创建对象与使用对象——谈谈工厂的作用
工厂模式(包括简单工厂模式、工厂方法模式和抽象工厂模式)到底有什么用,很多时候通过反射机制就可以很灵活地创建对象,为毛还要工厂?在本文中我将围绕创建对象和使用对象来简单谈谈工厂的作用。 与一个对象相关的职责通常有三类:对象本身所具有的职责、创建对象的职责和使用对象的职责。对象本身的职责比较容易理解,就是对象自身所具有的一些数据和行为,可通过一些公开的方法来实现它的职责。在本文中,我们将简单讨论一下转载 2016-01-01 23:05:43 · 910 阅读 · 0 评论 -
树形结构的处理——组合模式(五):公司组织结构,组合模式总结
11.5 公司组织结构在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是“一棵标准的树”,如图11-8所示: 在Sunny软件公司的内部办公系统Sunny OA系统中,有一个与公司组织结构对应的树形菜单,行政人员可以给各级单位下发通知,这些单位可以是总公司的一个部门,也可以是一个分公司,还可以是分公司的一个部门。用户只需要选择一个根节点即可转载 2016-01-19 11:29:30 · 6439 阅读 · 0 评论 -
树形结构的处理——组合模式(四):透明组合模式与安全组合模式
11.4 透明组合模式与安全组合模式通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类作为AbstractFile类的子类即可,但是由于在AbstractFile中声明了大量用于管理和访问成员构件的方法,例如add()、remove()等方法,我们不得不在新增的文件类中实现这些方法,提供对应的错误提示和异常处理。为了简转载 2016-01-19 11:06:52 · 2822 阅读 · 0 评论 -
树形结构的处理——组合模式(三):杀毒软件框架结构的解决方案
11.3 完整解决方案为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示: 在图11-5中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、TextFile和VideoFile充当叶子构件类。完整代码如下所示:import java.util.*;/转载 2016-01-18 16:29:49 · 784 阅读 · 0 评论 -
树形结构的处理——组合模式(二):组合模式概述
11.2 组合模式概述对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们,因为对于这些对象的区别对待将转载 2016-01-18 15:16:01 · 474 阅读 · 0 评论 -
树形结构的处理——组合模式(一):设计杀毒软件的框架结构
树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)。下面将学习这种用于处理树形结构的组合模式。11.1 设计转载 2016-01-18 00:09:08 · 1650 阅读 · 0 评论 -
处理多维度变化——桥接模式(四):与适配器模式的联用,总结
10.4 适配器模式与桥接模式的联用在软件开发中,适配器模式通常可以与桥接模式联合使用。适配器模式可以解决两个已有接口间不兼容问题,在这种情况下被适配的类往往是一个黑盒子,有时候我们不想也不能改变这个被适配的类,也不能控制其扩展。适配器模式通常用于现有系统与第三方产品功能的集成,采用增加适配器的方式将第三方类集成到系统中。桥接模式则不同,用户可以通过接口继承或类继承的方式来对系统进行扩展。桥接模式和转载 2016-01-17 11:10:32 · 2064 阅读 · 0 评论 -
处理多维度变化——桥接模式(三):跨平台图像浏览系统解决方案
10.3 完整解决方案为了减少所需生成的子类数目,实现将操作系统和图像文件格式两个维度分离,使它们可以独立改变,Sunny公司开发人员使用桥接模式来重构跨平台图像浏览系统的设计,其基本结构如图10-5所示: 在图10-5中,Image充当抽象类,其子类JPGImage、PNGImage、BMPImage和GIFImage充当扩充抽象类;ImageImp充当实现类接口,其子类WindowsImp、L转载 2016-01-17 10:50:33 · 1155 阅读 · 1 评论 -
处理多维度变化——桥接模式(二):桥接模式概述
10.2 桥接模式概述桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。桥接模式用一种巧妙的方式处理多层继承存在的问题,用转载 2016-01-15 16:57:07 · 568 阅读 · 0 评论