码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——结构型模式

时间:2021-02-20 11:49:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:硬盘   生成   屏蔽   访问   权限   参数   数据   imp   不兼容   


代理(Proxy)模式:【中介】
1.定义:给某对象提供一个代理以控制对该对象的访问。代理对象作为访问对象和目标对象之间的【中介】。
2.优点:a。中介作用保护目标对象的作用。b.可以扩展目标对象的功能.c.代理模式能将客户端与目标对象分离,降低了系统的耦合度.
3.缺点:请求处理速度变慢;增加了系统的复杂度;
4.结构:
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类:实现了抽象主题中的具体业务。
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用。
5.应用场景:
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。
例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
虚拟代理,这种方式通常用于要创建的目标对象开销很大时。
例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。
安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。
智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。
例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。
延迟加载,指为了提高系统的性能,延迟对目标的加载。
例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。


适配器(Adapter)模式:【转换器】
1.定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
2.优点:复用了现存的类、将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
3.缺点:更换适配器的实现过程比较复杂。
4.结构:
目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
适配器(Adapter)类:它是一个【转换器】,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
5.应用场景:
以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。


桥接(Bridge)模式:【两个可变维度】
1.定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
2.优点:由于抽象与实现分离,所以扩展能力强;其实现细节对客户透明。
3.缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
4.结构:
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
5.应用场景:
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。


装饰(Decorator)模式:【增加对象额外的功能】
1.定义:不改变现有对象结构的情况下,动态增加其额外功能。
2.优点:比采用继承方式更加灵活。扩展多样化。
3.缺点:子类多,使程序复杂。
4.结构:
抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
5.应用场景:
当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。
当对象的功能要求可以动态地添加,也可以再动态地撤销时。


外观(Facade)模式:【多个子系统】
1.定义:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
2.优点:
a.降低了子系统与客户端之间的耦合度.
b.对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
c.降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
3.缺点:
a.不能很好地限制客户使用子系统类。
b.增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
4.结构:
外观(Facade)角色:为多个子系统对外提供一个共同的接口。
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
客户(Client)角色:通过一个外观角色访问各个子系统的功能。
5.应用模式:
对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。



1.定义:运用共享技术来有效地支持大量细粒度对象的复用,提高系统的性能。享元模式的本质是分离与共享 :分离变与不变,并且共享不变。
2.优点:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。
3.缺点:
a.为了使对象可以共享【内部状态,可共享部分】,需要将一些【外部状态,不能共享】的状态外部化,这将增加程序的复杂性。
b.读取享元模式的外部状态会使得运行时间稍微变长。
4.结构:
抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
5.应用场景:
系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。
由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式。
String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说【享元模式是池技术的重要实现方式】。


组合(Composite)模式:【有层级的结构】
1.定义:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
2.优点:
a.组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
b.更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
3.缺点:
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;
4.结构:
抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
组合模式分为透明式的组合模式和安全式的组合模式:
(1) 透明方式:在该方式中,由于抽象构件声明了所有子类中的全部方法,所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。
但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,却要实现它们(空实现或抛异常)
(2) 安全方式:在该方式中,将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题。
但由于叶子和分支有不同的接口,客户端在调用时要知道树叶对象和树枝对象的存在,所以失去了透明性。
5.应用场景:
在需要表示一个对象整体与部分的层次结构的场合。
要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

参考链接: 设计模式——结构型模式:http://c.biancheng.net/view/1357.html;
参考链接: 享元模式:https://www.cnblogs.com/adamjwh/p/9070107.html;
参考链接: 享元模式:https://blog.csdn.net/justloveyou_/article/details/55045638;

设计模式——结构型模式

标签:硬盘   生成   屏蔽   访问   权限   参数   数据   imp   不兼容   

原文地址:https://www.cnblogs.com/duiyuedangge/p/14414024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!