目录
温馨提示:要想理解结构模式重点在最后的总结
简介
今天给大家分享一下设计模式中的结构型模式(适配器模式、桥接模式、装饰模式、代理模式、组合模式、外观模式、享元模式)
结构模式中包容了对很多问题的解决,例如:扩展性(外观、组成、代理、装饰),封装性(适配器、桥接)
结构型模式
结构型模式是为了解决怎样组装现有的类,设计他们的交互方式,从而达到我们需要的功能目的。
处理类或对象间的组合。它将以不同的方式影响着程序,允许在补充写代码或自定义代码的情况下创建系统,而且具有重复使用性和应用性能
定义及优缺点:
一、装饰模式(Decorator)
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点: | 1.把类中的装饰功能从类中搬移去除,这样可以简化原有的类。(有效的把类的核心职责和装饰功能区分开了)。 2.而且可以去除相关类中重复的装饰逻辑) |
缺点: | 如果装饰的对象过多,就会造成更多的系统资源被占用,装饰要适当。 |
适用场景: | 动态的给某一个对象增加职能,如果继承不方便扩展对象职能,装饰着模式会更加灵活。 |
二、代理模式(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。
优点: | 1.降低了真实主题角色和代理主题角色的耦合度。 2.可以扩展真实主题角色功能,灵活性扩展性好。 |
缺点: | 代理过程复杂,无论是速度还是实现过程中都比较繁琐。 |
适用场景: | 一个真实对象无法访问另一个对象或者访问另一个对象困难时,可以创建一个代理对象实现真实对象的访问。 |
关于代理模式还有类型,例如远程代理、虚拟代理、缓冲代理、保护代理等。
三、外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
优点: | 1.减少了客户端直接访问子系统,通过外观模式,更加方便的访问子系统。 2.减少了子系统和客户端耦合度,子系统变化不会影响客户端,客户端只需要调用外观类即可。 |
缺点: | 增加新的子系统需要改变外观类和客户端,违背开闭原则。 |
适用环境: | 1.访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。 2.减少客户端和子系统的独立性可以使用外观模式减少两者之间的耦合度。 |
四、适配器模式(Adapter)
将一类的接口转换成客户希望的另一个接口,Adapter模式使得原本又接口不兼容而不能一起工作的那些类可以一起工作。
优点: | 增加了类的复用性,在不修改原代码的基础上来复用现有类,符合 “开闭原则” |
缺点: | 使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。 |
适用环境: | 1.系统存在现有的类,但不符合标准,通过适配器进行复用。 2.建一个重复适用的类,用于一些配词关联不大的一些类,包括在将来引进的的类一起工作 |
五、组合模式(Composite)
将对象组合成树状形结构以表示<部分-整体>的层次结构。组合模式使得用户对单个对象何组合对象的使用具有一致性。
优点: | 1.可详细的定义分层次的复杂对象,用户可以忽略层次的差异。 2.基本对象可以被组合成复杂组合对象,这个组合对象也可以被组合,这样不断递归,客户端调用基本对象的地方都可以使用组合对象。 3.方便将新的叶子构件放入容器构件中。 |
缺点: | 层次关系的出现使得设计复杂。 |
适用场景: | 表示一个对象整体—部分的层次结构。 |
六、桥接模式(Bridge)
将抽象部分与它的实现部分抽离,使得它们可以独立地变化。
优点: | 1.解耦:分离了抽象接口和实现部分,将多个维度转化为各自独立的维度。 2.多个子类继承父类,当其中某一个子类添加新功能时,可以不更改子类,桥接模式间接的的实现了在C#中不可以实现多重继承的的缺陷。 3.提高系统扩展性,维度独立化,可以扩展任意维度,不需要对原有系统进行大规模修改,符合类开闭原则。 |
缺点: | 不容易区分两大维度,使用范围具有局限性。 |
适用场景: | 1.抽象部分和实现部分可以继承的方式独立,相互不影响。或者说一个类具有多个独立并且变化的维度 2.可以打破C#中,子类无法实现多重继承的缺陷。 |
七、 享元模式(Flyweight)
运用共享技术有效的支持大量细粒度对象。
优点: | 1.共享享元对象后,减少所需对象的实例化,防止内存的浪费。 2.减少内存对象数量,相同对象只有一个,并且作为享元对象。 |
缺点: | 将内部状态和外部状态分开,系统逻辑性更加混乱,当然这是不可避免的。 |
适用场景: | 1.系统中存在大量重复的对象,对系统内存造成了浪费。 2.享元对象必须多次重复使用,如果不多次重复的使用,共享效率低的话,不仅浪给内存,还影响系统运行效率 |
总结-让我容易理解结构模式
结构型的模式看名字也很好理解这个模式是在何种场景下适用的,下面就用简单举例理解结构型模式:
装饰模式:
就是类似给自己新买的房子装修,给房子里面添加家具,简单来说就是装饰外表但并没改变东西的本质。
代理模式:
这个名字很直白就是我们现代所说的代理,什么时候才找代理?当自己无法直接购买自己想要的商品时,就像设计模式中的一个对象无法直接访问另一个对象,用到代理模式间接的访问。
外观模式:
这个名字不太直观的可以让人理解,举个例子:就像是房屋中介,我们自己找房子不太好找,登门拜访后也许会不太满意,只要找到房屋中介自己提好需求他会帮你找房源,找好了给你打电话你只需要确定给你找的房子是否是你想要的,节省了自己的时间。外观模式就是把自己一对多个给包装成了一对一的简单接口。
适配器模式:
可以理解成我们手机上的转接头,有的手机的插口是圆的有的是扁的,当我们手中只有圆头耳机想要插入扁手机中听歌听不了就会用到转接头,转接头就类似我们的适配器,解决了不兼容的难题。
组合模式:
说到组合聚合就可以想到UML中的关系,组合:整体于部分的关系,有了整体才有部分,部分是不能脱离整体的。
聚合:部分是可以单独存在的。
桥接模式:
设想要绘制矩形、圆形、椭圆、正方形我们至少要4个形状类,但是如果绘制的图形需要具有不同的颜色红色、绿色、蓝色等词是至少有两种方案:
一、每一种形状提供一套各种颜色的版本。
二、根据实际需要对形状和颜色组合。
从图中就可以看出那种更加好看,图二就像是桥接模式,无论是对图形扩展还是对颜色扩展都会影响另外一个,这样我们把两个分别抽离出来,适用起来也会很灵活扩展也方便。自己所需要的东西就像是一个桥一样承载着两岸的车辆相互交往。
享元模式:
直接可以让我想到共享资源,信息共享是我们熟知的,有的可以共享有的就不能共享了,资源共享的例子太多了看看如何是有的能共享有的不能共享的吧。
内部状态:在享元对象的内部并且不会随着环境的改变而改变的共享部分。
外部状态:随环境改变而改变的,不可以共享的状态。