Structual设计--总结

1.结构型模式的讨论

我们可以注意到了结构型模式之间的相似性,尤其是他们的参与者与协作之间的相似性。这可能是因为结构型模型依赖于同一个很小的语言机制集合构造代码和对象:但继承和多继承机制用于基于类的模型,而对象组合机制用于对象模型。但是这些相似性掩盖了这些模型的不同意图。

2.Adapter和Bridge模式

Adapter模型和Bridge模型具有一些共同的特征。他们都给另一个对象提供了一定程度上的间接性,因为有利于系统的灵活性。他们都涉及到从自身以外的一个接口向这个对象转发请求。

这些模式的不同之处主要在于它们各自的用途 Adapter模式主要是为了解决两个已有接口之间不匹配的问题。他不考虑这些接口是怎样实现的,他不考虑他们各自可能会如何演化。这种方式不需要对两个独立设计的类中的任一个进行重新设计,就能够使它们协同工作。另一方面,Bridge模式则对抽象接口与它的(可能是多个)实现部分进行桥接。虽然这一模式允许你修改实现它的类,他仍然为用户提供了一个稳定的接口。Bridge模式也会在系统演化时适应新的实现。

由于这些不同点,Adapter和Bridge模式通常被用于软件生命周期的不同阶段。当你发现两个不兼容的类必须同时工作时,就必须使用Adapter模式,其目的一般是为了避免代码重复。此处耦合不可预见。相反,Bridge的使用者必须事先知道:一个抽象将由多个实现部分,并且抽象和实现两者是独立演化的。Adapter模式在类已经设计好后实施;而Bridge模式在设计类之前实施。在并不意味着Adapter模式不如Bridge模式,只是因为他们针对了不同的问题。

你可以认为facade是另一外一组对象的适配器。但这种解释忽视一个事实:即Facade定义一个新的接口,而Adapter则复用一个原有的接口。记住,适配器使两个已有的接口协同工作,而不是定义一个全新的接口。

3.Composite、Decorator与Proxy

Composite模式和Decorator模式具有类似的结构图,这说明他们都基于递归组合来组织可变数目的对象。这一共同点可能会使你认为,Decorator对象是一个退化的Composite,但这一观点没有领会 Decorator模式要点。相似点仅止于递归组合,同样,这是因为这两个模式的目的不同。

Decorator旨在使你能够不需要生成子类即可给对象添加职责。这样就避免了静态实现所有功能组合,从而导致子类急剧增加。Composite则有不同的目的,它旨在构造类,是多个相关的功能能够以统一的方式处理,而多重对象可以被当作一个对象来处理。它重点不在于修饰而在于表示。

尽管他们目的截然不同,但却具有互补性。因此composite和Decorator模式通常协同使用,在使用这两种模式进行设计时,我们无需定义新的类,仅需将一些对象插接在一起即可构建应用。这时系统将会有一个抽象类,他有一些composite子类和decorator子类,还有一些实现系统的基本构建模块。此时,composite和decorator将拥有共同的接口。从Decorator模式的角度看,composite是一个ConcregeComponent。而从composite模式的角度看,decorator是一个Leaf。

另一种与decorator模式结构相似的模式是Proxy。这两种模式都描述了怎样为对象提供一定程度上的间接引用,proxy和decorator对象的实现部分都保留了指向另一个对象的指针,它们向这个对象发送请求。然而同样,他们具有不同的设计目的。

像Decorator模式一样,Proxy模式构建成一个对象为用户提供一致性接口。但与Decorator模式不同的是,Proxy模式不能动态地添加或分离性质,它也不是为递归组合而设计的。它的目的是,当直接访问一个实体不方便或者不符合需要时,为这个实体提供一个替代者,例如,实体在远程设备上,访问受到限制或者实体是持久存储的。

在Porxy模式中,实体定义了关键功能,而Proxy提供(或拒绝)对它的访问。在Decorator模式中,组件仅提供了部分功能,而一个或多个Deocorator负责完成其他功能。Decorator模式适用于编译时不能确定对象的全部功能的情况。这种开放性使递归组合成为Decorator模式中一个必不可少的部分。而Proxy模式中则不是这样,因为Proxy模式强调一种关系(Proxy与它的实体),这种关系可以静态表达。

模式间的这种差异性非常重要,因为他们针对了面向对象设计过程中一些特定的经常发生问题的解决办法。但这并不意味着这些模式不能结合使用。可以设想有一个proxy-decorator,它可以给proxy添加功能,或是一个decorator-proxy用来修饰一个远程对象。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-10-09 09:09:14

Structual设计--总结的相关文章

Structual设计--Flyweight模式

1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中采用对象技术,但简单化的实现代价极大.如我们在使用word的时候,如果设置正文字体为:text.setFont(new Font("細明體", Style.BOLD, 12));每一个文字我们都需要这样设置,内存太大,而且也非常难记,稍有不注意就会出错.所以通常并不是对每个字符都用一个单独的对象去表示.Flyweight模式描述了如何共享对象,是的可以细粒度地使用他们而无需高

Structual设计--Adapter模式

1.意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作. 2.别名 包装器Wrapper. 3.动机 有时,为复用而设计的工具箱类不能够被复用原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配.具体场景可以描述为:基础功能类–>adapter专业接口–>专业调用,其中基础功能类可以理解为我们常见的jdk,也可以是一些sdk或者一些平台支持类. 4.适用性 以下情况使用Adapter模式 你想使用一个已经存在的类,而

Structual设计--Proxy 模式

1.意图 为其他对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate 3.动机 对一个对象进行访问控制的一个愿意是为了只有在我们确实需要这个对象时才对他进行创建和初始化.譬如手机上加载图片,每一个屏幕的大小是有限定的,我们无需每次把所有图片都加载上,只有在需要展示的时候才对图片进行创建和初始化. 4.适用性 在需要用比较通用和复杂的对象指针代理简单的指针的时候,使用Proxy.下面是一些可以使用Proxy模式常见的情况: 远程代理(Remote Proxy)为一个对象在不同的地

Structual设计--Bridge模式

1.意图 将抽象部分与它的实现部分分离,使他们都可以独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通常用继承来协调它们.抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现.但是此方法有时不够灵活.继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改.扩充和重用. 4.适用性 以下情况使用Bridge模式: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以

Structual设计--Composite模式

1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.别名 无 3.动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表.用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件.一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container). 然而存在一个问题:使用这些类的代码必需区别对待图元对

Structual设计--Facade模式

1.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用. 2.别名 无 3.动机 将一个系统划成为若干个子系统有利于降低系统的复杂性.一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小.达到该目标的途径之一是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面.例如算法库有很多算法类,我们在使用的时候分别去调用,最后算法库的外部调用和算法之间的关系会变的错综复杂,这就需要我们引入facad

Structual设计--Decorator 模式

1.意图 动态的给一个对象添加额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器Wrapper. 3.动机 有时,我们希望给某个对象而不是整个类添加一些功能.例如,肯德基推出特价套餐,如果套餐1中有:汉堡和鸡腿和价格,套餐二中有:薯条和汉堡和价格,如果做继承类,而且是多继承明显不够灵活,那么就需要装饰类. 4.适用性 以下情况使用Decorator模式 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理他那些可以撤销的职责. 当不能采用

设计模式(一)——设计原则

在一定环境下,用固定模式解决问题. 设计模式目前种类:GoF的23种 + "简单工厂模式" = 24种 包括: 创建型(Creational)模式:如何创建对象,6种 结构性(Structual)模式:如何实现类或对象的组合,7种 行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责,11种 学习设计模式有利于更深理解面向对象思想,让你知道: 1.如何将代码分散在几个不同的类中? 2.为什么要有"接口" 3.何胃针对抽象编程 4.何时不应该使用继承?

静态网页框架设计首次体验(文章改)

根据教材与上网成功解决了Tomcat与Myeclipse的安装,同时熟悉了Java web创建项目到部署运行整个过程.今天起正式开始学习有关Java web的编程部分.Java web静态网页(HTML网页)的标记含义.基本语法的介绍到框架设计基本模板与案例,今天的学习的内容,让网页编程有了一个初步的框架.结合自身所在协会的情况,计划制作一个关于协会的网页,已有初步想法,望通过学习不断完善和修改协会网站.根据今天所学,并参考书本30页框架设计案例对网页进行初步搭建. 具体代码如下 TW.jsp: