设计模式之结构型模式

 结构型模式(7种)
适配器模式

特点:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
备注:根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。
这里写图片描述
适用情景:
(1) 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
(2) 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
优点:
1,将目标类与适配者类解耦:就像自己的笔记本和电源之间一样,适配器充电器的作用使得只要有电源就可以使用笔记本,而不会固定在一个地方
2,增加类的复用性:同一个适配器类可以在多个不同的系统中复用。
3,灵活性和扩展性较好:就像手机充电器一样,你没有,借一借别人的就可以给自己的手机充电
缺点:
1,不能适配多个适配者
2,目标抽象类只能为接口,不能为类

桥接模式

特点:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
这里写图片描述
适用情景:
(1)如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2)“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
(3)一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
(4)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
优点:
1,分离抽象接口及其实现部分
2,提高了系统的可扩展性
缺点:
1,桥接模式的使用会增加系统的理解与设计难度

 装饰模式

特点:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。
这里写图片描述
适用情景:
(1) 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
(2) 当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种扩展或者扩展之间的组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类已定义为不能被继承(如Java语言中的final类)。
优点:
1, 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。
2,可以通过一种动态的方式来扩展一个对象的功能,从而实现不同的行为。
3, 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。
4,具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则”。
缺点:
1,使用装饰模式进行系统设计时将产生很多小对象,在一定程序上影响程序的性能。
2, 装饰模式提供了一种比继承更加灵活机动的解决方案,但同时也意味着比继承更加易于出错,排错也很困难,较为繁琐。

组合模式

特点:将多个对象组合成树形结构以表示具有“部分—整体”关系的层次结构。此模式使用户对单个对象和组合对象的调用具有一致性。
这里写图片描述
适用情景:
(1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
(2) 在一个使用面向对象语言开发的系统中需要处理一个树形结构。
(3) 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。
优点:
1,组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2,客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
3, 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
4,组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点:
在增加新构件时,很难对容器中的构件类型进行限制。

外观模式

特点:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。它是迪米特法则的一种具体实现。
这里写图片描述
适用情景
(1) 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
(2) 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
(3) 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

优点
1,对客户端屏蔽了子系统组件,使得客户端代码变得很简单。
2,子系统发生变化时,不会影响到调用它的客户端,只需调整外观类即可
3,一个子系统的修改,对其他子系统没有任何影响,而且子系统内部变化也不会产生影响
缺点:
1,不能很好地限制客户端直接使用子系统类
2,如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了“开放-封闭”原则

享元模式

特点:运用共享技术有效地支持大量细粒度对象的复用
这里写图片描述
适用情景:
(1) 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
(2) 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
(3) 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。
优点:
1,可以减少内存中对象的数量,从而节约系统资源,提高系统性能
2,享元模式的外部状态相对独立,而且不会影响内部状态,从而使得享元对象可以在不同环境中被共享
缺点:
1,使得系统变得复杂,因为需要分离出内部状态和外部状态。

代理模式

特点给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问
这里写图片描述
适用情景:
(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
优点:
1,协调调用者和被调用者,在一定程度上降低系统的耦合度
2,可以针对抽象主题角色进行编程,增加和更换代理类的时候不需要修改源代码
缺点:
1,因为在客户端和对象之间增加了代理,所以可能会造成请求的处理速度变慢。
2,实现代理模式需要额外的工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值