面相对象的艺术|设计模式2(结构型)


“ 设计模式 ”是 “面向对象设计模式” 的简称,是软件开发人员在软件开发过程中面临的一般问题的解决方案。


主要用来应对 类 的变化。


“ 设计模式 ”又分为:创建型模式、结构型模式、行为型模式。


本文介绍的“结构型”设计模式是从程序的结构上解决模块之间的耦合问题。



面相对象的艺术|设计模式2(结构型)_第1张图片



首先是结构型模式的几个细分:

1.桥接模式:对象的接口与实现

2.适配器模式:可以将类的一个接口匹配另一个接口

3.合成模式:对象的组合

4.门面模式:一个类表示一个子系统

5.装饰模式:动态给对象添加职责

6.代理模式:一个简单的对象代替一个复杂的稍后会被调用的复杂对象

1.桥接模式—— 适应对象接口与实现的多维变化

对象的变化,分为:接口变化、实现变化、属性变化。

当出现单纬度的变化时(接口变化/实现变化),我们通常有两个解决放啊:水平关联/继承。


面相对象的艺术|设计模式2(结构型)_第2张图片


但是,当多个纬度时变化时,单一的使用继承会导致子类数量的快速增长,单一的使用水平关联会导致扩展性变差。

所以在适应多维度变化时,我们使用桥接模式,将接口与实现分离。


面相对象的艺术|设计模式2(结构型)_第3张图片
桥接模式


2.适配器模式——将一个类的接口转换成客户希望的另外一个接口

当原接口不可修改,A和B两个类的接口不一致,而需要将B类当A类来使用时,使用适配器模式。


面相对象的艺术|设计模式2(结构型)_第4张图片



面相对象的艺术|设计模式2(结构型)_第5张图片
适配器模式


3.合成模式—— 将对象组合成树形结构以表示"部分-整体"的层次结构


面相对象的艺术|设计模式2(结构型)_第6张图片
树形结构


一个树结构由两种节点组成:树枝节点和树叶节点。树枝节点可以有子节点,而一个树叶节点不可以有子节点。除了根节点外,其它节点有且只有一个父节点。

当我们需要抽象的问题,同样具又这样的性质的时候,就需要使用合成模式了。

例子来自:http://blog.csdn.net/koudaidai/article/details/7340192



面相对象的艺术|设计模式2(结构型)_第7张图片
合成模式


在“故事”类中,组合一个 “根节点类”,就可以实现,故事既可以只有一重也有多重。


4.门面模式——用户并不关注我们如果写的代码


在我们的生活中医院就是这样的。一般的医院都会分为挂号、门诊、化验、收费、取药等。看病的病人要想治好自己的病(相当于一个客户端想要实现自己的功能)就要和医院的各个部门打交道。首先,病人需要挂号,然后门诊,如果医生要求化验的话,病人就要去化验,然后再回到门诊室,最后拿药,经过一系列复杂的过程后才能完成看病的过程。


例子来自:http://blog.csdn.net/xingjiarong/article/details/50066133


解决这一办法的设计是,提供一个接待员(门面模式)


面相对象的艺术|设计模式2(结构型)_第8张图片
门面模式

用户并不关心我们如何实现的功能,他们更希望直接使用

5.装饰模式—— 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能


面相对象的艺术|设计模式2(结构型)_第9张图片
装饰模式

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

如果单一的使用继承,将导致子类数量激增,并且只能改变单个子对象的功能。

如果单一的使用水平关联,新的类与父类不再是父子关系。

6.代理模式——一个是你要访问的对象(目标类),一个是代理对象

代理模式提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。


面相对象的艺术|设计模式2(结构型)_第10张图片
代理模式

你可能感兴趣的:(面相对象的艺术|设计模式2(结构型))