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

描述:

  • 如何组合类和对象以获得最大的结构;
  • 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法;

分类:

适配器模式 http://blog.csdn.net/huo065000/article/details/22177651
装饰模式 http://blog.csdn.net/huo065000/article/details/22061403
代理模式 http://blog.csdn.net/huo065000/article/details/22177651
外观模式 http://blog.csdn.net/huo065000/article/details/23181031
享元 模式 详见下文
桥接模式 详见下文
组合模式 详见下文

适配器模式可分为:类的适配器模式,对象的适配器模式,接口的适配器模式,其中对象的适配器模式则是各结构模式的起源:

Bridge模式:

意图:

将抽象部分与他的实现部分分离,使它们都可以独立的变化。其用意是:将抽象化与实现化解耦,使得二者可以独立变化。

就如生活中一样:在公路上随处可见小汽车,公共汽车,他们不但可以在市区内公路上行驶,还可以在高速公路上行驶;也就是说,对于交通工具来说,他们有着不同的类型,同时它们所行驶的环境也在变化,在软件设计中要适应这种两个或者多维度的变化,就要涉及到桥接模式。

画一个简单的结构图:

FlyWeight模式:

运用共享技术有效地支持大量细粒度的对象。主要解决由于相同数量过大而造成系统内存开销过大的问题。

享元模式,顾名思义最大的优势就是共享啦!在此也分为两种状态,举一个常见的例子,现在网上购物已经是一个潮流了!自己当然也是其中的一员了!网上购物真的是减少了自己出门的频率,这对于不喜欢逛街的自己来说是最好不过的了!作为一个淘宝店主的话,比如经营一款畅销的女士板鞋,在订单中需要注明客户需要的板鞋信息,这样我们可以将板鞋产品抽象出来:

class Shoe
        {
            string color;
            int size;
            string position;
            public string Getcolor()
            {
                return color;
            }
            public void Setcolor(string color)
            {
                this.color = color;
            }
            //还有重复的size和position代码,不做重复
        }

正如上边的代码一样,鞋子分为颜色,尺码和库存位置三项状态数据,其中颜色和尺码为鞋子的自然状态,我们称之为内部状态,这些状态只与对象本身有关,不会随外界的环境改变而发生变化;而库存位置,我们称之为外部状态,它与对象本身无必然关系,所以外部状态一般是由外界环境所决定的。

Composite模式:

意图:

将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。看到树形结构突然想到了《数据结构》课本中“树”那一章节了,在书中给出了“树”的固有特性:一颗非空树是由若干颗子树构成的,而子树又可由若干颗更小的子树构成。而这里的子树可以是叶子,也可以是分支。

结构图:

适应性:

1.你想表示对象的部分-整体层次结构

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

方式分类:

透明方式:

看图就可发现,Leaf中没有Add和Remove。但是为了方便,也就是为了让Leaf和Composite具备统一的接口,所以在Component中声明所有用来管理子对象的方法,使叶节点和枝节点对于外界没有区别,具备完全一致的行为接口。但是这样问题也会很明显,因为Leaf本身没有,这样实现根本就没有了意义。

安全方式:

在图中,不在Component接口中声明Add和Remove方法,即子类Leaf也不用去实现它,而是在子类Composite声明所有用来管理子类对象的方法,但是由于不够透明,所有树叶和树枝类不具有相同的接口,这样客户端调用时需要做相应的判断,带来了很大的不变。

由此看来,使用的时候真的得视情况而定了啊!其实组合模式最大的动机也就是让用户在使用时无需对Leaf和Composite进行区分,可以一致的对待容器对象和叶子对象,这样不就倾向于透明方式了吗?

总结:

模式比较:

1)从代码的角度来看,发现其实适配器模式和代理模式有些相似,只是前者解决现有对象在新的环境中所遇到的问题,后者解决直接访问对象时出现的问题,所以这两种模式从使用角度来看的话都是解决直接访问对象时出现的问题,只是含义不十分相同而已。

2)从外观上来看的话,适配器模式和外观模式都是对系统的封装,只是适配器是用来适配对象的,而外观是用来配合整个子系统的。

3)就外观模式与代理模式来说,我觉得他们两个只是解决的侧重点不同而已,解决的思路还是一样的,都是通过引用一层间接层。外观可以同代理模式同时使用,因为外观对象完全可以是一个远程地址空间对象的远程代理,简称为外观代理模式或者代理外观模式。

对于模式的学习还需要进一步的加深与理解,继续!

设计模式总结-结构型模式,布布扣,bubuko.com

时间: 2024-10-03 13:10:04

设计模式总结-结构型模式的相关文章

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

《设计模式》结构型模式1

上篇博文写了创建型模式中的(工厂家族).这次来介绍一下结构型模式.主要从各个模式的含义,优缺点,适用场合及结构图来了解结构型模式. 结构型模式包括有7种模式,适配器模式,外观模式,代理模式,桥接模式,享元模式,组合模式,装饰模式.每个模式各有优缺,孰优孰劣,请看下文. 1.适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构图: 适用于:想要使用一个已存在的类,但接口和你的要求不同时 在软件开发后期或是维护时期,在双方都不

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺

Java学习--设计模式之结构型模式(二)

一.装饰器模式(Decorator Pattern) 1.概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.简介 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引

设计模式(27)-----结构型模式-----过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准. 实现 我们将创建一个 Person 对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表.CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Pe

设计模式(28)-----结构型模式-----享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象.这里只有5个对象的. 介绍 意图:运用共享技术有效地支持大量细粒度的对象. 主