首页 > 代码库 > 大话设计 之结构型模式

大话设计 之结构型模式

一、它是什么?

结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定功能的目的。同时,结构型模式包容了对很多问题的解决,例如扩展性(外观模式,组成模式,代理模式,装饰模式),封装性(适配器模式,桥接模式)

二、它能做什么?

在不破坏类封装性的基础上,实现新的功能。这一点包括装饰模式,代理模式。

在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互,这一点包括桥接和适配器模式。

创建一组类的统一访问接口,这是组成模式

对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观模式。

三、成员

结构型设计模式是从程序的结构上解决模块之间的耦合问题。包括以下七种模式:

1.Adapte适配器模式: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示    目的:消除由于接口不匹配所造成的类的兼容性问题。

   特点:可以将原本由于不兼容接口而导致的不能在一起工作的类,通过一个适配器,将他们可以在一起工作。

   使用情况:原有的系统需要加入新的功能类,但是虽然新加入的类和原有的类功能上相似或一直,但是接口不兼容,则选择使用适配器模式。

   例如:笔记本 电源适配器,可以将220v转化为适合笔记本使用的电压。


2.Bridge桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。减少因变化带来的代码的修改量。

    特点:将系统的抽象与实现相分离,将抽象和实现进行解耦,二者可以进行各自的改变。在抽象类中,用抽象方法参与运算,而抽象方法的实现是由另外的层次来具体实现的,大大提升了系统的可升级性。 

    例如:经典例子,电灯开关,开关的目的是将设备打开或关闭,产生的效果不同。


3.Composite组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。        目的:通过继承统一的接口,我们可以将容器对象及其子对象看成同一类对象使用,以减少对象使用中的复杂度。

 例如:让用户一致地使用单个对象和组合对象,1+2和(1+1)+(2*3)都是合法的表达式。 单个与整体都可以进行加法运算符的操作。


4.Decorator装饰模式:Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。

   目的:给一个正在运行的对象添加额外的职责,而不是给整个类添加

   特点:继承于一个抽象类,但又使用此抽象类的聚合,使得此设计模式比静态继承更加灵活,对客户调用影响很小,避免继承层次太多而带来的耦合性的增加

   例如:一幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。


5.Facade外观模式:为子系统中的一组接口提供一个一致的界面,简化接口。

   目的:将系统内部的子模块提供一个一直的接口,使得系统更容易进行使用,可以将子系统与客户间的通信和交互、相互以来关系降低到最小。

   例如:我们拨打10086,可以办理,彩铃,手机报,全时通等业务(子对象),而10086则是为子对象所使用的一致界面。


6.Flyweight享元模式:运用共享技术有效地支持大量细粒度的对象。

   目的:如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作,享元模式的出现恰好解决了该问题。

 例如:公共交换电话网(PSTN)是享元的一个例子。有一些资源例如拨号音发生器、振铃发生器和拨号接收器是必须由所有用户共享的。

   当一个用户拿起听筒打电话时,他不需要知道使用了多少资源。对于用户而言所有的事情就是有拨号音,拨打号码,拨通电话。


7.Proxy代理模式:为其他对象提供一种代理以控制这个对象的访问。解决直接访问某些对象是出现的问题。

                目的:为某一个对象提供一个代理对象,用代理对象来控制对原有对象的引用。

    特点:代理模式一共有四种,其中远程代理是为一个在不同地址空间的对象进行代理,以隐藏了一个对象存在于不同地址空间的事实。

    虚代理的使用可以根据需要创建开销很大的对象代理。

    保护代理则可以控制对原有对象的访问,以应对所需代理的对象在不同情况下的不同访问权限等问题。

    最后智能引用则取代简单的指针,并在访问对象的时候执行一些附加的操作。

    例如:律师本身就是我们维权的一个代理!


   小总结:对于创建型、结构型、行为型模式的学习,结构型模式是花费我最长时间理解的,每个设计模式都有其特点,这就要求我们在编码过程中不能乱用。学习的过程是反复的,现在对于设计模式我也许理解的只是表面上的,但是,相信以后我用到它再来学习的时候,我能够理解的更好。