【面向对象】——设计模式之结构型模式

来源:互联网 发布:linux 显示到ip的流量 编辑:程序博客网 时间:2024/06/07 14:28

结构型模式包括:适配器、装饰、桥接、组合、享元、代理、外观模式。

适配器模式:

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。



什么时候用:使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。

就比如:一个只会说英文的上司给只会中文的员工分配任务,由于语言问题,该员工根本听不懂。但给员工配备一个翻译,就没问题了。那这个翻译就相当于适配器。

该例子的类图为:


桥接模式:

将抽象部分与它的现实部分分离,使它们都可以独立地变化。


实现系统可能有多角度分类,每一张分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

就比如:手机与软件的关系,若这样:

当有新软件产生时,需要在手机软件下添加新软件类,新软件类下还要加上所有手机品牌。该处只有两个品牌,若多的话,这种更改将是浩大的工程。

若利用桥接模式:


无论要增加手机品牌,还是软件,都只需更改相对应的类,不会对其他产生任何影响。该模式也很好的体现了合成/聚合复用原则。


组合模式:

将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


什么时候用:当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式了。

就比如:超市会员卡,该卡在总店可以刷,在下属分店也可以刷,在分店下属加盟店同样可以刷。并且人们不用考虑他在哪个店刷的,因为无论在哪刷卡,积分和折扣都是相同的。


装饰模式:

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。


装饰模式是为已有功能动态的添加更多功能的一种方式。

就比如:

刚买一辆汽车如下图

此汽车不符合你的个性要求,比如外表不够美观,发动机马力不足,不能满足你的速度激情,于是你需要对汽车的外表进行装饰,同时需要提高发动机的性能。这些操作通过装饰模式就能很好地解决问题。最终得到如下图所示的个性汽车。

外观模式:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。


什么时候用:首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观Facade。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,这时,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

就比如:开关。将复杂的内部结构增加一个外观,即按钮。当需要实现它的功能时,只需要点击按钮即可,不需要考虑内部啥样。


享元模式:

运用共享技术有效地支持大量细粒度的对象。


什么时候用:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

就比如:公共交换电话网的使用。公共交换电话网中的一些资源,例如拨号音发生器、振铃发生器和拨号接收器,都是由所有用户共享的,因为不可能为每一个人都配备一套这样的资源,否则公共交换电话网的资源开销就太大了。当一个用户拿起听筒打电话时,他需要的就是拨打号码,拨通电话就行了。所以,所有人共用一套资源,非常节省资源,这就是享元模式的基本思想。


代理模式:

为其他对象提供一种代理以控制对这个对象的访问。


什么时候用:第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。第二:虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。第三:安全代理,用来控制真实对象访问时的权限。第四:智能引导,是指当调用真实的对象时,打理处理另外一些事。

就比如:


结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式)。

总结对比:

代理模式&&外观模式

代理的客户对象无法直接访问目标对象,代理对象提供对单独目标对象的访问控制,而外观模式的客户对象可以直接访问子系统中的各个对象,但通常由外观对象提供对子系统个元件功能的简化的共同层次的调用接口。

 

代理模式&&适配器模式

二者都属于一种衔接性质的功能。代理对象和被代理对象的接口是同一个,但是客户没法直接访问被代理者,只能通过代理对象去完成被代理对象的访问。而适配器模式是将多个子系统封装起来,提供一个统一的外部接口,客户只需要使用这个外部接口即可访问对象的子系统了。

        

外观模式&&适配器模式

二者都是对系统的封装。外观模式定义了一个新的接口,而适配器则是复用了一个原有的接口;适配器是用来适配对象的,而外观则是用来适配整个子系统的。


4 0
原创粉丝点击