设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构。
- 结构型类模式采用继承机制来组合接口实现。
- 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
因为可以在运行时改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态组合是不可能实现的。
- Adapter(适配器)
- 将一个类的接口转换成客户希望的另外一个接口。
- Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- Convert the interface of a class into another interface clients expect.
- Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
- Bridge(桥接)
- 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- Decouple an abstraction from its implementation so that the two can vary independently.
- Composite(组合)
- 将对象组合成树形结构以表示 “部分-整体” 的层次结构。
- Composite 使得用户对于单个对象和组合对象的使用具有一致性。
- Compose objects into tree structures to represent part-whole hierarchies.
- Composite lets clients treat individual objects and compositions of objects uniformly.
- Decorator(装饰)
- 动态地给一个对象添加一些额外的职责。
- 就增加功能来说,Decorator 模式相比生成子类更为灵活。
- Attach additional responsibilities to an object dynamically.
- Decorators provide a flexible alternative to subclassing for extending functionality.
- Facade(外观)
- 为子系统中的一组接口提供一个一致的界面。
- Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- Provide a unified interface to a set of interfaces in a subsystem.
- Facade defines a higher-level interface that makes the subsystem easier to use.
- Flyweight(享元)
- 运用共享技术有效地支持大量细粒度的对象。
- Use sharing to support large numbers of fine-grained objects efficiently.
- Proxy(代理)
- 为其他对象提供一种代理以控制对这个对象的访问。
- Provide a surrogate or placeholder for another object to control access to it.
结构型模式之间存在很多相似性,尤其是它们的参与者和协作之间的相似性。
这是因为结构型模式依赖于同一个很小的语言机制集合构造代码和对象:
- 单继承和多重继承机制用于基于类的模式。
- 对象组合机制用于对象式模式。
Adapter 和 Bridge 的相似性
Adapter 模式和 Bridge 模式具有一些共同的特征。它们之间的不同之处主要在于它们各自的用途。
Adapter 模式主要是为了解决两个已有接口之间不匹配的问题。它不考虑这些接口时怎么实现的,也不考虑它们各自可能会如何演化。
Bridge 模式则对抽象接口和它的实现部分进行桥接。它为用户提供了一个稳定的接口。
Adapter 模式和 Bridge 模式通常被用于软件生命周期的不同阶段。
当你发现两个不兼容的类必须同时工作时,就有必要使用 Adapter 模式,以避免代码重复。此处耦合不可见。
相反,Bridge 的使用者必须事先知道:一个抽象将有多个实现部分,并且抽象和实现两者是独立演化得。
Composite 和 Decorator 的相似性
Composite 和 Decorator 模式具有类似的结构图,这说明它们都基于递归组合来组织可变数目的对象。
Decorator 旨在使你能够不需要生成子类即可给对象添加职责。这就避免了静态实现所有功能组合,从而导致子类急剧增加。
Composite 则有不同的目的,它旨在构造类,使多个相关的对象能够以统一的方式处理,而多重对象可以被当作一个对象来处理。它重点不在于修饰,而在于表示。
Decorator 和 Proxy 的相似性
Decorator 和 Proxy 模式描述了怎样为对象提供一定程度上的间接引用。
Decorator 和 Proxy 对象的实现部分都保留了指向另一个对象的指针,它们向这个对象发送请求。
同样,它们也具有不同的设计目的。
Proxy 不能动态地添加和分离性质,它也不是为递归组合而设计的。它的目的是,当直接访问一个实体不方便或不符合需要时,为这个实体提供一个替代者。
在 Proxy 中,实体定义了关键功能,而 Proxy 提供对它的访问。
在 Decorator 中,组件仅提供了部分功能,而 Decorator 负责完成其他功能。
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Structural Patterns(结构型模式)的更多相关文章
- .NET设计模式(15):结构型模式专题总结(转)
摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式).这些结构型模式,它们在某些方面具有很大的相似 ...
- Java设计模式——结构型模式
Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...
- NET设计模式 第二部分 结构性模式(14):结构型模式专题总结
——探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能( ...
- NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但 ...
- Java经典设计模式之七大结构型模式
转载: Java经典设计模式之七大结构型模式 博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以 ...
- Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
- Java 23种设计模式详尽分析与实例解析之二--结构型模式
Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- 设计模式(十二): Flyweight享元模式 -- 结构型模式
说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...
随机推荐
- Firefox 23中的新特性(新陷阱)
话说有一天突然发现我们的网站页面上的JQuery功能都失效了,Firebug中显示如下的错误 Blocked loading mixed active content "http://xxx ...
- css3 3d效果及动画学习
css参考手册: http://www.phpstudy.net/css3/ http://www.css88.com/book/css/ 呈现3d效果:-webkit-transform-style ...
- jquery的常用ajax操作
$.ajax() 定义和用法 ajax() 方法通过 HTTP 请求加载远程数据. 该方法是 jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() ...
- NLPP-03-Exercises
<PYTHON自然语言处理>第3章 处理原始文本 更多更复杂有关处理HTML内容 http://www.crummy.com/software/BeautifulSoup/ 3.11 深入 ...
- OpenShift:外国的免费云平台
二.安装openshift客户端 对于怎么安装openshift客户端,我就不说了,网上有很多教程,连官网也有他自己的教程. 官网教程:https://developers.openshift.com ...
- zabbix快速安装
运维什么的其实感觉根本没有什么好写的了,因为太简单了嘛,尤其是这个监控,整得那么麻烦要干嘛,不过貌似很多人喜欢这个,我就随手写一点吧 环境:centos7.2.1511最简安装,就是什么都不选直接就开 ...
- android项目中使用开源数据库litepal
下载地址 https://github.com/LitePalFramework/LitePal 参考文档 http://blog.csdn.net/guolin_blog/article/detai ...
- Matlab学习(一):数字图像处理大作业用到的函数
1.dlmread——将以 ASCII 码分隔的数值数据读入到矩阵中 dt = dlmread(,); dt = dt(:,); save('data2.txt','dt','-ascii'); 2. ...
- Windows平台使用Gitblit搭建Git服务器图文教程
Git服务现在独树一帜,相比与SVN有更多的灵活性,最流行的开源项目托管网站Github上面,如果托管开源项目,那么就是免费使用的,但是闭源的项目就会收取昂贵的费用,如果你不缺米,那么不在本文讨论的范 ...
- Dedecms 首页调用副栏目内容方法
最近一段时间一直打算修改英国移民网的首页,对首页的栏目内容也打算进行一系列的调用设置,可是在调用的时候出现了一些问题:调用不了英国移民网下的“移民快讯”这一副栏目下的内容!于是只能上网求助,在广大的网 ...