模式概述
组合模式是一种结构型设计模式,它可以将对象组合成树状结构,并且能像使用独立对象一样使用它们。
问题
假如存在两类对象:产品和盒子。一个盒子中可以包含多个产品或者几个较小的盒子。而小盒子中同样可以包含一些产品或更小的盒子,以此类推。
如果希望在这些类的基础上开发一个定购系统,订单中可以包含无包装的简单产品,也可以包含装满产品的盒子,以及其他盒子。
那么此时该如何计算每张订单的总价呢?
组合模式是一种结构型设计模式,它可以将对象组合成树状结构,并且能像使用独立对象一样使用它们。
假如存在两类对象:产品和盒子。一个盒子中可以包含多个产品或者几个较小的盒子。而小盒子中同样可以包含一些产品或更小的盒子,以此类推。
如果希望在这些类的基础上开发一个定购系统,订单中可以包含无包装的简单产品,也可以包含装满产品的盒子,以及其他盒子。
那么此时该如何计算每张订单的总价呢?
享元模式是一种结构型设计模式,它将在每个对象中都保存所有数据的方式,改为共享多个对象的状态,从而实现让有限的资源处理更多的任务。
也就是说,享元模式通过共享技术实现相同或相似对象的复用,从而节省宝贵的计算资源。
有一款极具特色的移动RPG游戏:大量且炫丽的粒子流会在整个地图上穿行,为玩家提供紧张刺激的体验。但游戏总是会在电脑上运行几分钟后崩溃。
当研究了几个小时的错误日志后,发现导致游戏崩溃的原因竟然是内存容量不足所引起。
移动设备的性能一般来说远比不上电脑,因此游戏运行在电脑上没问题而到了手机上却频频崩溃。
外观模式有的地方又叫门面模式,是一种结构型设计模式,为程序库、 框架或其他功能复杂的类提供一个统一的、简单的访问接口。
大多数程序员都有过开发复杂应用的经历,不仅需要负责所有对象的初始化,还得管理其依赖关系并按正确的顺序执行方法等。
而代码中的业务逻辑又常与第三方类的实现细节紧密耦合,使得理解和维护代码的工作很难推进。
通过一个简单的接口,来包含众多复杂子系统的各个功能。这与直接调用众多的子系统相比,既简化了调用过程中的繁杂操作(例如初始化、依赖管理及执行顺序),又将客户端真正关心的功能给呈现出来。
作为一种结构型设计模式,修饰器模式通过将对象放入另一个封装对象中来为原对象绑定新的行为,它有点像俄罗斯套娃。
有一个通知器Notifier
类,它有几个成员变量、一个构造函数和一个send()发送方法。
send()
方法可以接收来自客户端的消息参数,并将该消息发送给指定的邮箱列表。
客户端仅会创建和配置通知器对象一次,然后在有重要事件发生时对其进行调用。
作为一种结构型设计模式,桥接模式可将一个大类或一系列紧密相关的类拆分为抽象和实现两种不同的层次结构,做到各自独立使用。
假设现有一个名为Shape的类,可以从它扩展出两个子类:Circle和Square。但现在需要对这个继承结构进行扩展,让这些形状成为立体模型。
所以需要创建四个类才能覆盖到所有组合。
问题的根本原因是:试图在两个独立的层次,也就是形状与维度上扩展形状类Shape。
这是一种结构性设计模式,它使接口不兼容的对象之间能够相互合作。
手机充电头就是典型的适配器,它将中国大陆通行的220V交流电转换为10V左右的直流电,而且还附带了过压保护、过流保护和短路保护等额外功能。
有些爬虫程序可以从不同的网站下载XML格式的数据,然后从这些XML中提取所需要的内容。
但是公司现有的数据库只接受JSON格式的数据,之所以如此,是因为公司购买的商业报表软件只能识别JSON格式的数据,而且还无法修改或扩展。
可以开发一个专用数据格式转换程序,它输入XML格式的数据或文件,输出JSON格式的数据或文件,这样就既能实现数据爬取,又能满足商业报表软件的要求了。
代理模式是一种结构型设计模式,它能够提供对象的替代品或其占位符。
代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。例如,Nginx所提供的反向代理服务,就是一种代理。
如果一位亿万富翁带着大笔现金到处走动,一来行动肯定是非常不方便,二来也非常不安全,容易被偷或者被抢。
但如果不带这些钱他又无法顺利地和客户达成交易。
为此,银行发明了储蓄卡和信用卡,这就是富翁所拥有的银行账户的代理,而银行账户背后则代表着一大堆的现金。