结构型模式:优化软件结构的策略
- 代理模式(Proxy Pattern)
代理模式就像一个经纪人,代表真实对象进行操作。比如,在网络访问中,我们可能会通过代理服务器来访问外部网站。在软件中,当一个对象由于某些原因(如访问权限限制、创建开销大等)不能直接访问另一个对象时,可以通过代理对象来间接访问。代理对象可以在访问真实对象前后添加一些额外的逻辑,如权限验证、缓存处理等。 - 适配器模式(Adapter Pattern)
想象你有一个欧式插头的电器,但家里只有美式插座,这时候就需要一个转换插头(适配器)来让电器正常使用。在软件中,适配器模式用于将一个类的接口转换成客户希望的另一个接口。当我们需要使用一个现有的类,但它的接口与我们的需求不兼容时,就可以使用适配器模式。例如,有一个旧的支付接口,新的业务系统需要与之集成,但新系统使用的是不同的接口规范,这时候就可以创建一个适配器类,将旧支付接口适配成新系统可以使用的接口。 - 桥接模式(Bridge Pattern)
桥接模式将抽象部分与实现部分分离,使它们可以独立变化。以手机为例,手机有不同的品牌(抽象部分),每个品牌又可以有不同的操作系统(实现部分)。如果不使用桥接模式,可能每个品牌的手机都要和每个操作系统进行组合,导致类的数量急剧增加。而使用桥接模式,将品牌和操作系统分离,通过一个桥接接口进行关联,这样当新增一个品牌或者一个操作系统时,只需要添加相应的类,而不需要修改其他类的代码,提高了系统的可维护性和扩展性。 - 装饰器模式(Decorator Pattern)
装饰器模式就像给蛋糕添加不同的装饰,在不改变对象本身的基础上,动态地给对象添加新的功能。比如,一个简单的咖啡对象,我们可以通过装饰器为它添加牛奶、糖、奶油等不同的配料,从而得到不同口味的咖啡。在软件中,当需要在运行时给对象添加功能,而又不想通过继承的方式来扩展类时,装饰器模式是一个很好的选择。它通过创建一个装饰器类,将被装饰的对象作为成员变量,在装饰器类中可以调用被装饰对象的方法,并添加新的功能。 - 外观模式(Facade Pattern)
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。就像电脑的开机键,按下它就可以启动电脑的各个硬件组件,而用户不需要了解每个硬件组件是如何启动的。在软件中,当一个系统由多个复杂的子系统组成,客户端需要与这些子系统进行交互时,使用外观模式可以提供一个简单的接口,隐藏子系统的复杂性,降低客户端与子系统之间的耦合度。 - 享元模式(Flyweight Pattern)
享元模式旨在复用对象,减少对象的创建数量,以提高系统的性能。比如在一个围棋游戏中,棋盘上有大量的棋子,每个棋子的颜色、形状等属性是相同的,只是位置不同。我们可以将这些相同属性的棋子共享,只创建少量的棋子对象,通过改变它们的位置来表示不同的棋子。在软件中,当有大量相似对象存在,且这些对象的创建和销毁开销较大时,享元模式可以有效地减少内存占用,提高系统的运行效率。 - 组合模式(Composite Pattern)
组合模式用于将对象组合成树形结构,以表示 “部分 - 整体” 的层次关系。例如,在一个文件系统中,文件夹可以包含文件和子文件夹,文件和文件夹都可以看作是节点,通过组合模式可以方便地对整个文件系统进行遍历、操作等。组合模式使得客户端可以统一对待单个对象和组合对象,简化了代码的实现。