设计模式总结之结构型模式

结构型模式描述如何组织类和对象以组成更大的结构。结构型类模式采用继承机制来组合接口和实现,结构型对象模式则采用组合聚合来组合对象以实现新功能,可以在运行时刻改变对象组合关系,具有更大灵活性,故这里只关注结构型对象模式。一般常见的结构型模式有7种:ABCDFFP(Adapter,Bridge,Composite,Decorator,Façade,Flyweight,Proxy)

1.适配器模式(Adapter)使由于接口不兼容而不能一起工作的类可以一起工作。有类或对象适配器模式,解决已存在目标客户接口和已存在功能类接口不兼容的问题。对象适配器模式实现上是适配器对象包含一个被适配器对象来进行接口转换;一般是项目改造或扩充时才用到。适配器模式使得一个接口和其它接口兼容,从而给出了多个不同接口的统一抽象。

协作:Client在Adapter的实例上调用一些操作,适配器调用含有的Adaptee对象实现这个操作。

2.桥接模式(Bridge):将抽象和实现分离,使他们可以独立的变化。分离接口和实现,从而使抽象类的实现可以在运行时刻配置,在运行时刻改变其对象的实现;接口实现分离有利于系统分层,从而产生跟好的结构化系统,可以独立的对Abstractation和Implementor层次结构进行扩充。封装多维变化,抽象角色内含一个抽象实现角色,精确抽象角色调用父类中的抽象实现角色对象实现,具体实现角色继承抽象实现角色,如果再增加一维抽象,可以当抽象实现角色,在原有的抽象实现角色中包含新增的抽象实现角色,也可以当成新的抽象角色,原有的抽象角色作为一个抽象实现角色;这样说该模式实现时从抽象实现角色这维变化最好。实例:不同人开不同车在不同路上行驶;不同名牌手机有不同系统不同软件功能;

协作:Abstraction将Client的请求转发给它的Implementor对象。

3.组合模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。即组合模式定义树状结构,可以将子对象当成整体对象一样处理;抽象构件对象,树枝构件对象,树叶构件对象,根据叶子是否当成枝干来看待可分为透明性和安全性两种模式。组合模式必须提供管理子对象的方法,但管理对象的方法是在Component中就声明还是在Composite中声明呢?如下图在Component中声明所有用来管理子类对象的方法,以达到Component接口的最大化,从而使客户在接口层次上看树叶和树枝没有区别——透明性,但树叶是不存在子类的,可能有安全问题。

下图只在Composite中声明所有管理子类的方法,避免了上面的安全性问题,但是树枝和叶子又不同的接口,失去了透明性。

协作:用户使用Component类接口与组合结构中的对象交互,如果接收者是一个叶节点,则直接处理请求,如果接受者是Composite,它通常将请求发送给它的子部件,再转发请求之前或之后可能执行一些辅助操作。

实例:java单元测试框架Junit定义了两个概念:TestCase和TestSuite,前者是一个编写测试的类,后者是一个不同TestCase的集合,集合里也可以再包含TestCase,这样运行一个TestSuite会将其包含的TestCase全部运行。Junit采用了组合模式将TestCase和TestSuite统一起来,创建一个Test接口来扮演Component角色,TestCase扮演Leaf角色,Testsuite扮演Composite角色。Junit是一个偏重安全性的组合模式,因此用TestCase和Testsuite时不能直接用Test代替。

4.装饰者模式(Decorator):动态的给对象增加一些职责,比生成子类更灵活。装饰者模式描述了如何动态的给对象增加职责,采用递归方式组合对象从而允许你添加任意多的职责。

参与者:a抽象构件角色(Component):定义抽象接口,以规范准备接收附加职责的对象。

b具体构件角色(ConcreteComponent):被装饰者。

c装饰角色(Decorator):持有一个构件对象实例,并定义了抽象构件定义的接口。

d具体装饰角色(ConcreteDecorator):负责给构件增加功能。

协作:Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

实例:Junit采用了装饰模式,在java.extensions包中,TestDecorator、RepeatedTest便是对TestCase的装饰模式的扩展。使用方法如:TestDecorator test=new RepeatedTest(new TestXX(),3);。

5.外观模式(Facade):为子系统中的一组接口提供一个一致的界面,使这一子系统更加容易使用。外观模式用于给多个子系统定义一套统一的外观,描述了如何用单个对象表示整个子系统。Façade被客户角色调用,熟悉子系统的功能,内部根据客户角色已有的需求预定了几种功能组合。

协作:客户程序通过发送请求给Façade的方式与子系统通信,Façade将这些消息转发给适当的子系统对象;使用Façade的客户程序不需要直接访问子系统对象。

6.亨元模式:运用共享技术有效的支持大量细粒度对象。java中string的实现,细化对象共享粒度;

参与者:a.Flyweight:描述一个接口可以接受并作用于外部状态。

b.ConcreteFlyweight:实现Flyweight并为内部状态增加存储空间。ConcreteFlyweight对象必须是可共享的,它所存储的状态必须是内部的。

c.unsharedConcreteFlyweight:并非所有Flyweight子类都需要被共享,unsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

d.FlyweightFactory:创建并管理flyweight对象,确保合理的共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(不存在的话)。

e.维持一个对flyweight的引用,计算或存储flyweight的外部状态。

协作:flyweight执行所需的状态必定是内部的或外部的,内部的状态存储与ConcreteFlyweight对象之中,而外部对象由Client对象存储或计算。当用户调用flyweight操作时将该状态传递给它。用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这样可以保证它们适当地进行共享。

7.代理模式(Proxy):为其它对象提供一种代理以控制对这种对象的访问。代理模式提供了对对象的一些特有性质的一定程度上的间接访问,从而限制、增强或修改这些性质。

协作:代理根据其种类,在适当的时候向RealSubsject转发请求。

常见使用代理模式的情况:a远程代理:为一个对象在不同的地址空间提供局部代表。

b.虚代理:根据需要创建开销很大的对象。

c.保护代理:控制对原始对象的访问权限。

d.取代了简单的指针,它在访问对象时执行一些附加操作。

设计模式总结之结构型模式相关推荐

  1. 设计模式7大结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 结构型模式:结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例.故可以分为类 ...

  2. iOS设计模式四部曲(二) 结构型模式 内附Demo

    本篇是四部曲的第二篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式 内附Demo,关于设计模式强烈推荐图书<Head First设计模式>以及<研磨设计模式>.由于个人 ...

  3. 《设计模式》3.结构型模式

    点击进入我的博客 3.1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 3.1.1 类的适配器结构 目标(Targe ...

  4. Java设计模式之七大结构型模式

    总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 结构型模式,共有七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 其中适配器模式主要分为三类:类的适配 ...

  5. Java设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  6. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  7. 【设计模式】【结构型模式】装饰器模式

    概念 定义 装饰模式指动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  8. 初探Java设计模式2:结构型模式(代理模式,适配器模式等)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

最新文章

  1. mysql 数据文件压缩,压缩MySQL数据文件的妙招
  2. 模式的学习笔记----转摘自把爱好作为自己工作的人
  3. python基础语法第10关作业-Python基础语法习题一
  4. boost::safe_numerics模块实现数据类型下溢的测试程序
  5. 【教女朋友学网络系列5】之VLAN与Trunk、单臂路由
  6. java面试题(转载其他人,方便日常看)
  7. YBROJ洛谷P3211:XOR和路径(线性基,期望dp)
  8. 利用swoole coroutine协程实现redis异步操作
  9. Spark大数据-TMDB电影数据分析(spark-scala版)
  10. btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
  11. python数据汇总_Python,将数据框中的每日数据汇总到每月和每季度
  12. 基于python获取雅虎金融股票数据及相关可视化操作
  13. swd只能下载一次第二次出现错误
  14. 在EXCEL使用VLOOKUP函数实现自动匹配
  15. VS2019加载QT插件提示“未将对象引用到对象的实例” 以及 “未能正确加载VSIX包”的问题
  16. 云栖专辑 | 阿里开发者们的20个感悟,一通百通
  17. 中国工业信息终端行业供需情况及竞争趋势分析报告(2022-2027年)
  18. Grads画等值线(一)-----心得感言
  19. hihocoder 1531 德国心脏病 (模拟)
  20. 张驰课堂:六西格玛培训数据收集的几种方法

热门文章

  1. 《深入理解Java虚拟机》 第4章 虚拟机性能监控与故障处理工具
  2. android触屏设备event模拟,android 使用命令模拟点击 滑动
  3. 怎样实现banner自动播放html,纯css实现轮播图banner自动轮换效果
  4. Keras及其前端配置
  5. html树形结构_数据结构-线性表.md
  6. Learning to Reconstruct 3D Human Pose and Shape via Model-fitting in the Loop
  7. 【Python】简单实现显示图片的高斯和中值滤波效果
  8. 2013计算机二级试题,2013年3月全国计算机二级VFP真题
  9. oledb连接服务器的文件,请教OLEDB链接和ODBC链接连接的不同和对系统的要求...
  10. C++函数参数传递--值传递和地址传递