设计模式学习总结

设计模式学习总结
设计模式学习总结

设计模式学习总结

Interpreter模式:这个模式主要试图去解释一种语言。如果你学过形式语言,那么这个模式对你来说是多余的。I terator模式:这个模式试图隐藏集合的内部表示,又同时可以使用户依次访问集合中的元素。现在STL和Java的跌代器就是应用这个模式的结果。S tate模式:这个模式的意图是允许对象在其状态改变时修改其行为,好像对象改变了。这个模式的应用场景是当对象的行为依赖于对象的状态时。为了实现这个模式,我们可以为每个状态下的行为实现一个类,当对象的状态发生改变,它调用不同状态对象的实例方法。注意,以前可能需要使用switch或者if 语句进行分支转换,现在则利用多态机制完成。Flyweight模式这个模式利用共享有效的支持大量的细粒度的对象。比如,编辑软件中,一篇文章有很多个字符,我们可以对每个字符对象生成一个对象,如果这篇文章有几M个文字,那么对象的数量肯定是不能容忍的。使用Flyweight模式,我们将所有的文字对象共享起来,文章中的字符仅仅是指向共享池中的某个对象的索引。

在这里要搞清楚一件事情,利用Flyweight模式不会有效地减少信息的数量(也就是软件的空间开销),因为无论是否共享,表达这么多信息所需要的编码数量是一定的,所以开销不会大幅减小。只是,这个模式会减少系统中对象的数量,因为大量的对象会被共享。

在编辑软件中,字符对象被共享,那么一篇文章中的文字,可以按照段落、格式等等进行结组,一组文字构成一个对象,这样对象从单个文字变成一组文字,数量大幅减少。

在使用Flyweight模式需要注意的一点,由于对象被共享了,因此这些对象没有各自的属性,那么根据上下文环境,我们在使用这些对象的时候,必须向它传递一些参数。在编辑软件中,这些参数可能就是字体、字号、颜色等等信息。

使用Flyweight模式还有一个好处,那就是我们可以在不修改系统的情况下增加享元。Command模式 Command模式,将一个请求封装为一个对象。这样,你可以向客户端发送不同请求的参数,排队或记录请求,同时可以支持不能执行的请求。

在软件中,不同的模块、对象之间经常会各种调用,或者我们称之为请求。传统的方法,我们将请求实现为函数调用。这样做是最简单的方法,但却在无形之中增加了模块之间的耦合度。当请求发生很大变化的时候,系统将变得很难维护。与此同时,当服务端(接受请求的一端)增加或者删除一个请求的时候,按照传统的方法,客户端(发送请求的一端)也必须重新编译(这一点在删除请求的时候最明显),这样系统才能正确运行。

使用Command模式的一个核心思想就是,服务端提供一个统一的请求处理接口,客户端则通过调用接口向服务端发送请求,这些请求被封装成对象的形式(或者其等价形式)。在《设计模式》中,“四人团”并没有强调统一接口的事情,它强调了另一

个方面,那就是封装请求。事实上,封装一个请求总是要求有一个地方来接受和处理这个请求的,这个地方实际上就是统一请求接口。

在《设计模式》中,请求被封装成一个Command对象,这个对象保存着请求类型、参数等信息,服务端收到这个命令后就会执行Command对象中的Execute()函数,这个函数具体实现了真正的操作。这种实现方法可以保证增加新的请求而不必重新编译服务端。

我个人认为,Command模式的另一个形式就是在服务端实现各种操作,Command对象只是负责指明请求的类型,这样,当服务器端发现请求不正确时,可以忽略该请求。和上一种形式相比,这种形式更加简洁(因为可以不真正实现Command对象,在C++中可以使用不定参数实现),但是缺少灵活性。C ommand模式使得记录请求成为了可能,我们可以捕获系统中的请求对象,记录他们。Composite模式 Composite模式的意图是“将对象组合成树形结构表示‘整体-部分’的层次结构。Composite使得用户对单个对象和组合对象的使用更具有一致性”。

在Word中我们经常会将一些图元进行“组合”,组合以后的图形还可以向简单图元那样进行移动、变形等等操作;除此以外,在Word中,我们对于一个字符、一个词组、一句话、一个段落,甚至是整篇文章的操作是相同的,我们都可以进行剪切、复制,进行字体与大小的调整,进行颜色的变换。这些例子都是

Composite模式的实例,我们将简单的元素组合成复杂的元素,然后还可以像操作简单元素那样操作组合元素。C omposite模式将子元素组织成树型,实际上,组织成图型也没有问题。用户总是喜欢组合简单元素,一方面,用户可以通过这样的组合来进行抽象,另一方面,用户可以通过组合化简繁琐的操作。Composite模式在各种可视化编辑软件中应用得最为广泛。

另一使用Composite的经典例子是Java的Swing系统。所有的Swing组件都是继承自一个叫做JComponent的接口,因此,我们对一个JFrame的操作和对一个JButton的操作是一样的。这同时也使得,JFrame在管理自己的子元素时,它不需要知道他们是一个JButton还是一个JPanel,对它来说,这只是一个JComponent。

实现Composite模式的关键是良好设计的接口,人们应该对可能的元素(简单的、组合的)进行分析,并设计出通用的操作。尽可能的保证接口操作对所有元素都是有意义的,否则就应该将那些只对部分元素有意义的操作下放到子类中。Proxy模式按照“四人团”的说法,Proxy模式可以为控制另一个对象而提供一个代理或者占位符。

这个模式可以使我们在真正需要的时候创建对象,如果我们不需要这个对象,Proxy模式会为我们提供一个占位符。如果我们有大量这样消耗很大的对象的时候,我们就可以使用Proxy模式,初始情况下,Proxy模式只会提供占位符而不会真正创建对

象,但是对于使用者来说,他看到是真正的对象而不是一个代理。一旦使用者需要获得或者更改对象属性的时候,Proxy模式就会创建该对象,在此之后,我们就可以通过代理访问真正的对象了。

在Word里面应该是使用了Proxy模式。打开一篇含图的很长的文档时,大部分的图片都不会被载入,而仅仅是提供占位符,只有当用户准备察看这一页的时候,代理才会真正载入图片。

和Singleton模式一样,Proxy模式都是保证我们可以按需分配对象,不同的是,Singleton模式还会保证在全局范围内使用同一个对象实例,而Proxy则没有这个功能。Visitor模式按照“四人团”的说法,Visitor模式的意图为:将元素的操作表示成一种结构。这样Visitor模式可以使你在不修改元素结构的前提下增加新的操作。

考虑一个链表,我们需要一个求得最大元素的操作,这个操作可能是遍历每个节点,然后求的最大值。这个时候我们又需要一个为每个元素加1的操作,这个操作还需要遍历每个节点,同时将每个元素加1。与之类似,还会有很多其他的针对元素操作,他们的特点都是要遍历链表。这个时候可以使用Visitor模式,结点类负责依次遍历,并调用Visitor类中的函数,而Visitor 类的具体实现则负责完成功能。

这里需要注意的是,Visitor类只能是一个接口,针对不同的操作需要有不同的具体实现,针对不同的具体元素,需要设计不

同的操作。每个元素负责选择自己应该调用的操作,Visitor子类负责实现具体功能。

一个已知的应用是SmallTalk-80的编译器,在编译时,编译器需要建立一棵语法树。在这个时候,它使用了Visitor模式,针对不同的操作,比如:类型检查、代码生成等操作实现不同的Visitor具体类,Visitor类中针对不同的节点类型提供不同的操作接口,具体的节点负责选择调用哪种接口,这像是一种回调操作。Observer模式按照“四人团”的说法,Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。

实际应用的例子是,比如建模工具中,若干条线形元素附着在一个块状元素上,当块状元素的大小、位置发生变化,那些线形元素也需要进行改变,这个时候我们就可以应用Observer模式,在块状元素和线形元素之间建立一对多的关系,并利用这一模式进行维护。O bserver模式首先构造一个Observer类,在这个类中具有一个update函数。被依赖的对象拥有它,依赖的对象被注册到Observer中,当被依赖的对象发生变化的时候,就调用update函数更新所有依赖它的对象。更新的方式由update函数具体实现。

还有一个现实中的例子,各个部门之间进行通讯,当一方发出新的信息时,按照传统的方法它必须告诉所有其他部门。如果使用Observer模式,那么产生新消息的一方只需要告知

Observer,由Observer通知其他方面。TemplateMethod模式Template Method模式的意图是:“定义一个操作中的骨架,而将一些步骤延迟到子类中。这使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。

这一模式和Strategy模式似乎和相似,但是他们的关注点不同。策略模式主要用于算法的替换,但是模板方法模式主要用于算法中特定步骤地替换。一个应用模板方法模式的例子是数据库操作。对于数据库操作可以有很多中,比如查询、更新。查询又可以分为连接数据库、发送请求命令、解析结果等等步骤。对于不同的数据库,比如Oracle和SQL2000,它们连接数据库、命令格式可能有所不同,但是就查询和更新着两个操作来说它们的步骤是相同的。这个时候,我们可以应用模板方法模式,为查询、更新操作建立一个抽象的算法,具体的步骤交给子类来实现。如果对于策略模式,我们替换的将是查询和更新着两个操作。

但是,将Template Method模式和Strategy模式进行类比是危险的,这两个模式有着很多重要的不同,但这些不同却又是分的细微,只能意会不能言传。FactoryMethod模式这一模式的意图是:“定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method是一个类的实例化延迟到其子类。” 这一模式的关键是掌握“何时应用这一模式”,事实上我觉得这也是所有设计模式的关键。一个已知的应用就是MFC中关于Document 和Frame之间的关系。通常在生成一个多文档程序时,VC会为你

创建一个Frame类和Document类,你的Frame类可以用来相应OnFileNew消息,然后创建一个Document对象。但是对于Windows的消息系统来说,它并不知道用户程序中创建的Document类有什么特性,对于它来说,它所看到是CFrame对象和CDocument对象。Factory Method模式可以保证其他对象不需要

知道具体对象的类型而管理这些对象,这一模式通常用于制定框架。

这一模式和Abstract Factory模式很相像,事实上Abstract Factory模式可以由一系列Factory Method模式实现。Strategy 模式 Strategy模式的目的就是“定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换。” 如何理解这一模式,首先看下面这个场景:一组数据进行排序,我们可以选择很多中

排序算法,这个时候我们定义一个排序策略,然后每个排序算法

实现一个具体策略,这样用户就可以在几个不同的排序算法中随

意选择和替换了。

当然,上面的例子中使用策略模式似乎多此一举,那么假设

游戏中的敌人的AI,根据玩家的设定可以有不同的级别。在这种情况下,使用策略模式就是分必要的了。Bridge模式按照“四人团”的说法,Bridge模式的意图是:将抽象部分与他的实现部分分离,使得他们可以独立的变化。你一定会感到一阵眩晕,不明

白这是什么意思。

首先应该说明的是“抽象”与“实现”的含义。在刚才的那句话中,“抽象”与“实现”并不是我们在描述类结构时所说的“接口”与它的“实现”,或者在Java中抽象类与他的实现。在这里,“抽象”与“实现”只得是某种工作,“抽象”是说如何完成这项工作,“实现”是说“抽象”中所用的步骤的实现。

一个例子可以很好的说明“抽象”与“实现”的关系。我们编写一个游戏,这个游戏有两个版本,DX版本和OpenGL版本。我们如何编写这两个版本呢?一种方法是我们在这两个引擎上开发两套独立的游戏,但这显然不是最好的方法。另一个选择是我们将游戏的“抽象”部分与“实现”部分分离,开发一套“抽象”部分,开发两套“实现”部分。那么什么是游戏的“抽象”部分?很显然就是游戏的绘图(也许用更专业词汇的应该是:渲染)过程,例如我们如何渲染游戏的人物,这个人物可能是由很多个多边形组合而成的,我们按照一定的方法渲染之后,就可以画出一个人物来。这一部分就可以看作是“抽象”。那么另一方面就是“实现”部分,在上面的例子中,“实现”部分就是如何绘制基础的线条、填充颜色,甚至是初始化屏幕等等。这些“实现”和具体的引擎密切相关。

为什么说我们可以将“抽象”和“实现”分离,使得他们可以各自变化呢?假设现在要开发新的游戏,或者这个游戏升级了,在其中出现了新的人物,那么“抽象”部分就发生了变化,但是具体“实现”没有变化,因此这个游戏还可以继续在你的计

算机上运行。另一方面,如果游戏需要进行移植,目标平台的图形系统发生了变化,你可能需要使用新的绘图引擎,这个时候,你只需要利用新的引擎实现基本的“实现”操作,原始的程序就可以在新的平台上运行(略去重新编译的问题)。Facade模式Facade模式的目的就是给子系统提供一个统一的接口。现在的软件都是按照模块进行划分,对不同的模块分别进行编程。但是在用户开来,不同的模块应该具有统一的接口,换句话说,我们应该可以通过统一的接口访问系统中的所有功能。

有一个很典型的例子就是编译系统。通常我们将编译系统分解为:Compile和Link两个步骤。一个Compile又可以分解为词法分析、语法分析、语义分析、中间代码生成等等步骤。对于用户来讲,我们不可能将这些模块分别提供给他们,让他们依次调用。相反的,我们应该提供一个统一的接口,使得用户可以方便的使用各个功能,例如IDE 。F acade模式在强调模块化开发的同时也强调模块的统一,统一的接口也有利于子系统中模块内部的变化。对于开发大型系统来说,Facade模式是不可缺少的。Decorator模式按照“四人团”的说法,Decorator模式的意图是:动态的给一个对象添加一些额外的职责。值得注意的是,这个对象不知道他增加的是什么职责。

这个模式的一个典型应用实例是:Java的流。一个文件流(Java、IO、File)用于读写文件,如果你想使用文件缓冲,你可在为File添加一个BufferedInputStream或者

BufferedOutputStream外观,这样这个文件流就具有了缓冲。再如一个Reader类,你可以给他增加缓冲BufferedReader,然后你还可以给这个缓冲流增加一些格式化读取的能力。D ecorator模式可以动态的增加对象的额外的职责,这也有利于将额外的功能分别实现,使得用户可以自由组合。Adapter模式有一天你在网上找到一个库,你打算把它应用到你的程序当中去,但是你发现这个库的函数不符合你的风格,你会怎么办?一个很简单的方法就是使用Adapter模式。A dapter模式的目的就是将一个类的接口转换为用户希望的接口,使得由于接口不兼容而不能一起工作的各个类可以一起工作。

例如在一个软件里面可能使用了以前一个版本的类库。不幸的是这个类库的效率极高却和现在的接口不兼容,为了继续复用这个类库我们就可以使用Adapter模式,在原来的类库和现在的接口中间实现一个适配器,使得我们可以用现在的结构调用以前的类库。

例如一个绘图程序(这种事情总是出现在这类程序中),以前的类库中提供绘制直线的方法DrawLine,但是新的接口要求绘图系统还要提供绘制矩形、折线形的方法,为了复用这个类库,我们实现一个Adapter类,这个类中利用以前的绘图系统提供的方法实现了新的接口功能。Singleton模式这可能是最简单的一个模式了,但是他的应用却是最多的。这个模式的目的就是保证一个对象只有一个实例,并且提供一个全局的访问点。

那么这个模式的怎么实现呢?很简单,你首先必须为这个类设置一个指针(Java中是引用),然后提供一个方法用来获得这个类的实例。在这个方法中首先判断这个指针是否为空,如果是,则创建一个实例,否则直接返回这个指针。

虽然我们可以提供一个全局访问点,但实际上这个模式也可以应用到局部。应用这个模式一个好处就是可以“按需分配”,同时也封装了对象的获取过程。不论如何,我觉得应该尽可能的应用这个模式,虽然这会让你感到很烦…… 这个模式在实现过程中可以进行变化,例如在Instance()方法上添加参数Boolean bAlloc,用于指定当实例不存在的时候是否进行创建。这样做是考虑到,有些时候我们获得实例的目的不是为了修改,而是为了读取。这个时候,返回一个空实例和返回一个没有被修改过的实例在逻辑上是相同的。例如,这个对象是一个数组时,一个“空数组”和一个“空白的数组”是相同的。Builder模式按照“四人团”的说法,Builder模式的目的是:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

一个典型的例子是:文件的格式转换。假设一个RTF文件,我们可以将它转换成不同的格式,比如TXT、DO

C、PDF等等。在这些目标格式的文件中,有些文件格式中保留文本字体(比如DOC),有些可能不保留(比如TXT)。当我们开始转换过程时,按照RTF文件自己的格式进行分析转换。转换的过程是一样的,但是不同的目标文件格式对于不同的转换请求

的处理是不同的,比如TXT文件转换将会忽略所有的文本格式控制符,但是DOC文件将会把RTF的控制符转换为自己的控制符。应用Builder模式,我们可以实现不同的具体生成器,对于相同的请求产生不同的结果。D irector负责向Builder发送不同的生成请求,在刚才的例子中,RTF文档的分析器可以看作是Director,文档转换器可以看作是Builder。另一个可以想到的例子是一个编成开发环境,我们可能对源程序进行语法分析,但是分析的目的可能不同,有的分析可能是用来生成代码,有的可能是用来形成智能感知。不论如何,语法分析的过程是相同的,因此将语法分析看成一个Director,代码生成和形成智能感知看作是两个ConcreteBuilder,对于相同的分析请求产生不同的动作。例如当分析器发现一个函数以后,就会向Builder发送请求,如果这个Builder实例是代码生成器,那么它可能会记录这个函数的入口地址,如果这个Builder实例是智能感知器,那么它可能像数据库中插入这个函数的信息。AbstractFactory模式这个模式的关键就是设计一个AbstractFactory接口,这个接口提供了一系列抽象函数用来创建各种对象。这个模式的意图就是使用一个统一的接口用以创建不同具体对象。

假设这样一个场景,在不同配置的计算机上完成显示和打印任务,对于高配置的计算机我们使用高分辨率的驱动,在低配置上的机器使用低分辨率的驱动。这个时候,我们可以将显示驱动看成ProductA,打印驱动看成ProductB;每种驱动具有两种分辨

率,分别对应高低两种配置。这个时候在创建(配置)系统驱动的时候,我们就可以使用AbstractFactory模式,为高低两种配置实现两个具体工厂类,分别用于创建对应的驱动。所有的用户不用关心当前是什么配置的计算机,它只需要调用统一的抽象工厂接口就可以获得对应的驱动。

使用这个模式还需要注意的是,产品对象也必须具有良好的设计,以至于用户不需要关心具体的产品是哪种类型就可以通过抽象产品的接口使用这个产品。使用这个模式可以令用户无需关心具体环境,降低代码耦合度,使得程序结构更加清晰。缺陷是当每个产品的具体实现有很多种时,实现的具体工厂类的数量会迅速膨胀,而且它不能对环境的改变进行立即响应。

软件设计师23种设计模式总结

创建型结构型行为型 类Factory Method Adapter In terpreter Template Method 对象 Abstract Factory Builder Prototype Si ngleto n Apapter(对象) Bridge Composite Decorator Fa?ade Flyweight Proxy Chain of Resp on sibility Comma nd Iterator Mediator Meme nto Observer State Strategy Visitor (抽象工厂) 提供一个创建一系列相关或互相依赖对象的接口,而无须制定它们具体的类。 图10-25抽象工厂模式结构图 Abstract Factory 抽象工厂 class Program { static void Main(string[] args) { AbstractFactory factory1 = new Con creteFactory1(); Clie nt c1 = new Clie nt(factory1); c1.Ru n(); AbstractFactory factory2 = new Con creteFactory2(); Clie nt c2 = new Clie nt(factory2); c2.Ru n(); Co nsole.Read(); abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB

设计模式优缺点及应用场景整理

看完发现有不太对的地方告诉我下 各设计模式优缺点总结 1桥接模式 优点:1 将实现予以解耦,让它和界面之间不再永久绑定 2 抽象和实现可以独立扩展,不会影响到对方 3 对于“具体的抽象类”所做的改变,不会影响到客户。 缺点:1. 增加了复杂度 用途:1. 适合使用在需要跨越多个平台的图形和窗口上 2. 当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。 具体实例:跨平台的软件,不同电视机和不同的遥控器。 2生成器模式(建造者模式) 优点: 1.将一个复杂对象的创建过程封装起来 2.允许对象通过多个步骤来创建,并且可以改变创建过程 3.向客户隐藏内部的表现 4.产品的实现可以被替换,因为客户只看到一个抽象的接口 缺点: 1.与工厂模式相比,采用生成器模式创建对象更复杂,其客户,需要更多的知识领域。用处: 用来创建组合结构。 典型例子: 想不起典型例子 还是扯那个画小人,构建小人分画头,画身体,画双手,黄双脚等不同构建部分,全部放在一起构建。 3职责链模式 优点: 1.将请求的发送者和接收者解耦 2.可以简化你的对象,因为它不需要知道链的结构 3.通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任 缺点: 1.并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外 2.可能不容观察运行时的特征,有碍于除错。 用途:

经常被使用在窗口系统中,处理鼠标和键盘之类的事件。 当算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并且希望比较容易的扩充文法,可以采用职责链模式。 1)有多个对象处理请求,到底怎么处理在运行时确定。 2)希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。 3)可处理一个请求的对象集合应该被动态指定。 典型例子: 一个请求发送给前台,前台表示我无权管理,将请求传递给财务部门,财务部门再……4蝇量模式(享元) 优点: 1.减少运行时对象实例的个数,节省内存 2.将许多“虚拟”对象的状态集中管理 缺点: 一旦你实现了它,单个的逻辑实现将无法拥有独立而不同的行为 用途: 当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用蝇量模式。(这话什么意思啊,HF书上原话,是这话有问题还是我理解能力有问题?!) 具体场景: 五子棋中的黑白子,改变坐标状态(x,y),但用同一个实体。 5解释器模式(这个模式我真没仔细看) 优点: 1.将每一个语法规则表示成一个类,方便事先语言。 2.因为语法由许多类表示,所以你可以轻易地改变或扩展此语言 3.通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的梅花或者进行复制的程序验证。 缺点: 当语法规则数目太大时,这个模式可能会变得非常繁琐。 用途: 1.当你需要实现一个简答的语言时,使用解释器 2.当你有一个简单的语法,切简单比效率更重要时,使用解释器 3.可以处理脚本语言和编程语言 典型例子:正则表达式 6中介者模式 优点: 1.通过将对象彼此解耦,可以增加对象的复用性。 2.通过将控制逻辑集中,可以简化系统维护

Java设计模式学习心得

Java设计模式之心得 UML 1.案例图:系统角色和使用案例和它们之间的关系 2.类图: 类图中的关系 1.一般化关系:继承,接口 2.关联关系:类与类之间的联系Driver中的Car 3.聚合关系:整体与个体之间的关系 4.合成关系:强关联,整体包含部分,整体代表部分的生命周期,不能共享 5.依赖关系:类与类之间的连接,如Person包含Car和House 3.时序图: 每个步骤的流程图 4.状态图:一系列对象的内部状态及状态变化和转移 5.合作图:相互关系图 6.构建图:部署的软件构件之间的关系 7.活动图: 8.部署图: 面向对象的设计原则: 1.设计目标:可扩展性、可维护性、可插入性、可复用性 2.设计原则:开闭原则、里氏替换原则、依赖倒转原则、接口隔离原则、组合\聚合复用原则、迪米特法则 开闭原则:

OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。 一句话:“Closed for Modification;Open for Extension”——“对变更关闭;对扩展开放”。开闭原则其实没什么好讲的,我将其归结为一个高层次的设计总则。OCP的动机很简单:软件是变化的。不论是优质的设计还是低劣的设计都无法回避这一问题。OCP说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求。 重要的步骤: 1.抽象化 2.对可变性的封装原则 里氏替换原则: 1.分析对象时必须明确是Is-a还是Has-a的关系,任何基类适应的地方,子类一定适用依赖倒转原则: 要依赖于抽象,不要依赖于具体。简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。 接口隔离原则: 使用多个专门的接口比使用单一的总接口要好。广义的接口:一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。因此一个接口应当简单的代表一个角色,而不是一个角色。,如果系统设计多个角色的话,则应当每一个角色都由一个特定的接口代表。狭义的接口(Interface):接口隔离原则讲的就是同一个角色提供宽、窄不同的接口,以对付不同的客户端。 组合\聚合复用原则: 要尽量使用组合/聚合,而不是使用继承来达到目的 原因: 继承复用的缺点:静态复用 什么使用使用继承:a.满足is-a的关系,而不是has-a的关系 b.满足lsp原则 优点:a.简洁 b.父类修改某个方法,子类能获得 迪米特法则: 一个对象或模块应该和其它对象和模块尽量少的通信(高内聚),涉及的模式有:门面模式,调停者模式,前端控制器模式,业务代表模式,dao模式

23种设计模式趣味讲解

23种设计模式趣味讲解 对设计模式很有意思的诠释,呵呵,原作者不详。 创立型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,固然口味有所不同,但不管你带MM往麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类离开。花费者任何时候需要某种产品,只需向工厂恳求即可。花费者无须修正就可以接纳新产品。毛病是当产品修正时,工厂类也要做相应的修正。如:如何创立及如何向客户端供给。 2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同处所的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM 我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这必定比美军在伊拉克用的翻译机好卖) 建造模式:将产品的内部表象和产品的天生过程分割开来,从而使一个建造过程天生具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变更,客户不必知道产品内部组成的细节。建造模式可以强迫履行一种分步骤进行的建造过程。 3、FACTORY METHOD—请MM往麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。 工厂方法模式:核心工厂类不再负责所有产品的创立,而是将具体创立的工作交给子类往做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的串口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE—跟MM用QQ聊天,必定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要) 原始模型模式:通过给出一个原型对象来指明所要创立的对象的类型,然后用复制这个原型对象的方法创立出更多同类型的对象。原始模型模式容许动态的增加或减少产品类,产品类不需要非得有任何事先断定的等级结构,原始模型模式实用于任何的等级结构。毛病是每一个类都必须配备一个克隆方法。 5、SINGLETON—俺有6个美丽的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,

设计模式心得体会

设计模式心得体会 7月初的一个周末,准确的说应该是7月1号周六,在网上看到一本《大话设计模式》的书,而且看到很多很好的评论,于是乎,下载了电子书看看,一下子看了几章之后,对设计模式有了个了解,于是继续上网搜些其他资料,进一步了解设计模式。。。最终结论:设计模式是个好东西,具体怎么好,一两句话是无法概括的,也是从那天起,我就决定学习设计模式,于是就看《大话设计模式》,至七月十多号,大概看了一百多页后,感觉有点难,有点看不下去的感觉,于是上网找其他的好方法,无意间发现了李建忠老师的《c#设计模式纵横谈》系列讲座,微软的web cast课程,主要讲解gof的23个设计模式,每个一讲,加上一头一尾,共25讲,试听了一节课后,感觉很有用,于是就抽时间去边听课边看书,并在我的博客里写下笔记,依赖加深印象,二来可以督促我的进度。。。 三个月以来,总算把设计模式学完一遍了,原计划是两个月学完(一星期三个模式),由于。。。计划两个月学完实际花了三个月,感触多多,收获多多——对c#语言有了更进一步的认识,对oo的思想有了更全面的了解。。。 下一步在设计模式方面的计划:巩固并运用设计模式,巩固:把《大话设计模式》,《设计模式》,《设计模式——可

复用的面向对象基础》,《敏捷软件开发:原则、模式与实践》这些书再结合起来系统的看一看,当然还会去买一些我手头上没有的关于设计模式的书;运用:部门前几天也提倡用c#来改版vb程序,我想这是一个很好的平台,正好有机会把理论的东西在实际中应用,理论加实际——唯一的学习方法。。。 下面对各个模式再简单总结一下: 1、创建型模式: singleton:解决的是实例化对象的个数的问题,比如抽象工厂中的工厂、对象池等,除了singleton之外,其他创建型模式解决的都是 new 所带来的耦合关系。 abstract factory:创建一系列相互依赖对象,并能在运行时改变系列。 factory method:创建单个对象,在abstract factory 有使用到。 prototype:通过拷贝原型来创建新的对象。 factory method,abstract factory, builder都需要一个额外的工厂类来负责实例化“一边对象”,而prototype 则是通过原型(一个特殊的工厂类)来克隆“易变对象”。 如果遇到“易变类”,起初的设计通常从factory method 开始,当遇到更多的复杂变化时,再考虑重构为其他三种工

23种设计模式的通俗理解

23种设计模式的通俗理解【转】 1、FACTORY 工厂方法 追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER 抽象工厂 MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱 你”builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD 建造者模式 请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE 原型模式 跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 5、SINGLETON 单态模式 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事) 单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。[b:9ceca65206]结构型模式[/b:9ceca65206] 6、ADAPTER 适配器模式 在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我) 适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,

模式总结

设计模式总结 一、创建型模式 简单工厂 简单工厂最大优点在于工厂类中包含了必要的逻辑判断(switch),根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。 工厂方法 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法模式实现时,客户端要觉定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在时修改客户端。 抽象工厂 抽象工程模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。 原型模式 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。(拷贝对象的引用地址《浅表副本》)。.NET在System命名空间中提供了ICloneable接口(里面唯一的方法Clone()),只要实现这个接口就可以完成原型模式。 建造者模式 建造者模式(Builder),将一个复杂对象的构造过程与它的表示分离,使得同样的构造过程可以创建不同的表示。

如果使用建造者模式,那么用户就只需建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。——抽象不应该依赖细节,细节应该依赖于抽象。建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。 单例模式 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 二、行为型模式 观察者模式 观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能自动更新自己。 当一个对象的改变需要同时改变其他对象的时候,而且他不知道具体有多少对象有待改变,应该考虑使用观察者模式。观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不依赖于具体,从而使得各自的变化都不会影响另一边的变化。 模板方法模式 模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构可重复定义该算法的某些特定的步骤。 模板方法模式是通过把不变行为搬移到超类,去除子类中德重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。 状态模式 状态模式(State),当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来像是改变了其类。

设计模式复习提纲

设计模式复习提纲 第一章 1.状态图的定义 状态图用来描述一个特定对象的所有可能状态及其引起状态转移的事件。 第二章 1.软件的可维护性和可复用性(?) 软件可维护性,即维护人员对该软件进行维护的难易程度,具体包括理解、改正、改动和改进该软件的难易程度。 可复用性:复用又叫重用,是重复使用的意思。 2.面向对象设计原则 (1)单一职责原则 (2)开闭原则 (3)里氏代换原则 (4)依赖倒转原则 (5)接口隔离原则 (6)合成复用原则 (7)迪米特法则 3.单一职责原则定义 单一职责原则定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 另一种定义:就一个类而言,应该仅有一个引起它变化的原因。 4.开闭原则定义 开闭原则定义:一个软件实体应当对扩展开放,对修改关闭。 5.里氏代换原则定义 里氏代换原则有两种定义方式。 第一种定义方式相对严格,其定义如下: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P 在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。第二种更容易理解的定义方式如下: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。 6.依赖倒转原则定义 依赖倒转原则定义:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 另一种表述为:要针对接口编程,不要针对实现编程。 7.接口隔离原则定义 接口隔离原则定义:客户端不应该依赖那些它不需要的接口。注意:在该定义中的接口指的是所定义的方法。

另一种定义方法:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。 8.合成复用原则定义 合成复用原则,又称为组合/聚合复用原则,其定义如下:尽量使用对象组合,而不是继承来达到复用的目的。 9.迪米特法则定义 迪米特法则,又称为最少知识原则,它有多种定义方法,其中几种典型定义如下: (1)不要和“陌生人”说话。 (2)只与你的直接朋友通信。 (3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。 第三章 1.模式的定义 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再重复相同的工作。可以用一句话简单表示为:模式是在特定环境中解决问题的一种方案。 2.设计模式的定义 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 3.设计模式的基本要素 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面:模式名称、问题、解决方案、效果。 4.设计模式的分类 (1)根据其目的(模式是用来做什么的)可分为创建型、结构型和行为型三种: ①创建型模式主要用于创建对象。 ②结构型模式主要用于处理类或对象的组合。 ③行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。 (2)根据范围,即模式主要是用于处理类之间关系还是处理对象之间的关系,可分为类模式和对象模式两种: ①类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的。 ②对象模式处理对象间的关系,这些关系在运行时刻变化,更具动态性。 5.GoF设计模式简介 GoF 最先将模式的概念引入软件工程领域,他们归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。

关于23种设计模式的有趣见解

创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM 去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖) 建造模式:将产品的部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的部表象的产品对象。建造模式使得产品部表象可以独立的变化,客户不必知道产品部组成的细节。建

造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。 工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要) 原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

23种模式详解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。 三、Java的23中设计模式 从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。 1、工厂方法模式(Factory Method) 工厂方法模式分为三种:

Java23种设计模式6大原则总结

设计模式概念:一套被反复使用、多数人知晓、经过分类编目的优秀代码设计经验的总结。设计模式要素:模式名称、问题、举例、末态环境、推理、其他有关模式、已知的应用。设计模式分类:创建型、结构型、行为型。 创建型模式功能:1.统所使用的具体类的信息封装起来; 2.类的实例是如何被创建和组织的。 创建型模式作用:1.封装创建逻辑,不仅仅是new一个对象那么简单。 2.封装创建逻辑变化,客户代码尽量不修改,或尽量少修改。 常见的创建型模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。常见的结构型模式:代理模式、装饰模式、适配器模式、组合模式、桥梁模式、外观模式、享元模式。 常见行为型模式:模板方法模式、命令模式、责任链模式、策略模式、迭代器模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式。单一职责原则:一个类应该只有一个职责。 优点:降低类的复杂性;提高类的可读性;提高代码的可维护性和复用性;降低因变更引起的风险。 里氏替换原则: 优点:代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的可重用性;提高代码的可扩展性;提高产品或项目的开放性。 缺点:1.继承是入侵式的。只要继承,就必须拥有父类所有属性和方法。 2.降低代码的灵活性。子类必须拥有父类的属性和方法,使子类收到限制。 3.增强了耦合性。当父类的常量、变量和方法修改时,必须考虑子类的修改,这种 修改可能造成大片的代码需要重构。 依赖倒置原则:高层模块不应该依赖低层模块,两者都依赖其抽象;抽象不依赖细节;细节应该依赖于抽象。 在Java中的表现:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;接口或抽象类不依赖于是实现类; 实现类依赖于接口或抽象类。 接口隔离原则:1.一个类对另外一个类的依赖性应当是建立在最小的接口上的 2.一个接口代表一个角色,不应当将不同的角色交给一个接口。 3.不应该强迫客户使用它们的不同方法。 如图所示的电子商务系统在三个地方会使用到订单类:一个是门户,只能有查询方法;一个是外部系统,有添加订单的方法;一个是管理后台,添加、删除、修改、查询都要用到。“原子”在实践中的衡量规则: 1.一个接口只对一个子模块或者业务逻辑进行分类。 2.只保留接口中业务逻辑需要的public方法。 3.尽量修改污染了的接口,若修改的风险较大,则可采用适配器模式进行转化处理。 4.接口设计应因项目而异,因环境而异,不能照搬教条。 迪米特法则:(表述)只与你直接的朋友们通信;不要跟“陌生人”说话;每一个软件单位 对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密 切相关的软件单位。 对迪米特法则进行模式设计有两个:外观模式、中介者模式。 开闭原则:一个软件实体应当对扩展开放,对修改关闭。 重要性体现:提高复用性;提高维护性;提高灵活性;易于测试

设计模式学习总结

设计模式学习总结 引子 刚开始学习设计模式的时候.感到这些模式真的非常抽象。今年下半年以来.随着我们组工作重点的转移.以及我在小组中角色的变化.我开始有条件提出自己对新系统的设计想法。在设计过程中.我发现了很多设计模式的用处.也确实应用了很多设计模式.这让我越来越感到设计模式的重要性.因此我写了这十余篇专门介绍设计模式的文章.作为我的学习笔记。 《设计模式——可复用的面向对象软件的基础》(有趣的是.梅宏一再在组会上强调应该译成重用)中介绍了一共23种设计模式.我一共写了19个设计模式(其中三个和在一篇文章中).余下四个.考虑到该模式的应用范围我就没有介绍。在写这些文章时.其中的很多例子都是我在实践中提炼出来的.当然也有很大一部分是《设计模式》中的例子。不过.这四个人(四人团)生活的年代里现在已经很远了.所以它们的例子也很古老。 让我们更加设计模式 设计模式是个好东西.它给出了很多设计中的技巧与思路.对于很多优秀的设计.它加以总结与提炼。设计模式并非四人团拍脑瓜想出来的.而是他们搜集了其他人优秀的设计.加以整理出来的.他们不是这些模式的创造者.仅仅是整理者。 应用设计模式会给我们带来很多好处:软件将变得更加灵活.模块之间的耦合度将会降低.效率会提升.开销会减少。更重要的.设计模式就好像美声唱法中的花腔.让你的设计更加漂亮。总的来说.设计模式似乎将软件设计提升到艺术的层次。 设计模式已经被广泛的应用了.在现在很多的图形界面框架都使用了MVC模式.大量跌代器模式的应用.彻底改变了我们对集合的操作方式。不仅如此.应用了设计模式的设计.往往被看成为优秀的设计。这是因为.这些设计模式都是久经考验的。 模式不是模型 在学习和使用设计模式的时候.往往出现一个非常严重的误区.那就是设计模式必须严格地遵守.不能修改。但是设计模式不是设计模型.并非一成不变。正相反.设计模式中最核心的要素并非设计的结构.而是设计的思想。只有掌握住设计模式的核心思想.才能正确、灵活的应用设计模式.否则再怎么使用设计模式.也不过是生搬硬套。

设计模式报告

课程名称设计模式课程设计 设计题目设计模式在FileUpload 组件中的应用 班号专业软件工程 学生姓名 ###### 指导教师(签字) 课程设计说明书

目录 第一章设计模式概述 1.1模式与设计模式 1.2设计模式的定义 1.3设计模式的基本要素 1.4设计模式的分类 第二章FileUpload组件简介 2.1FileUpload组件由来及使用 2.2 FileUpload组件的工作原理 2.3 FileUpload组件中的部分接口、类简介 第三章设计模式在FileUpload组件中的应用 3.1 工厂方法模式在FileUpload组件中的应用 3.2 策略模式在FileUpload组建中的应用 3.3 迭代器模式在FileUpload组建中的应用 3.4 FileUpload组件中的重要类图 第四章结束语 4.1 收获与总结 4.2 参考文献 第一章设计模式概述

1.1模式与设计模式 模式起源于建筑业而非软件业,模式(Pattern)之父—美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士。Alexander给出了关于模式的经典定义:每个模式都描述了我们环境中不断出现的问题,然后描述了解决这个问题解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案,无需再重复相同的工作,也可以用一句话概括为:模式是在特定环境中解决问题的一种方案。 最早将Alexander博士的模式思想引入软件工程方法学的是以四人组(Gang of Four,GoF)自称的四位著名软件工程学者,他们在1949归纳发表的23中在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法学在分析、设计和实现间的鸿沟。 GoF将模式的概念引入软件工程领域,标志着软件模式的诞生,软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思想或参照样板软件模式并非仅限于设计模式,还包括架构模式、分析模式、和过程模式等。 从1987年Kent Beck和Ward Cunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式到目前设计模式在软件开发的广泛应用,Sun公司的Java SE/Java EE平台和Microsoft公司的.net平台设计中就应用了大量的设计模式。再设计模式领域,下一的设计模式是指GoF的《设计模式:可复用面向对象软件的基础》一书中包含的23中经典设计模式,不过设计模式并不仅仅只有这23中,随着软件开发技术的发展,越来越多的模式不断诞生并得以广泛应用。 1.2设计模式的定义 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。 1.3设计模式的基本要素 1.3.1模式名称(Pattern name)

Java23种设计模式(总结)

Java设计模式

目录 1. 设计模式3 1.1 创建型模式4 1.1.1 工厂方法5 1.1.2 抽象工厂9 1.1.3 建造者模式14 1.1.4 单态模式20 1.1.5 原型模式22 1.2 结构型模式25 1.2.1 适配器模式26 1.2.2 桥接模式29 1.2.3 组合模式35 1.2.4 装饰模式40 1.2.5 外观模式45 1.2.6 享元模式50 1.2.7 代理模式55 1.3 行为型模式59 1.3.1 责任链模式59 1.3.2 命令模式64 1.3.3 解释器模式69 1.3.4 迭代器模式73

1.3.5 中介者模式79 1.3.6 备忘录模式83 1.3.7 观察者模式88 1.3.8 状态模式94 1.3.9 策略模式98 1.3.10 模板方法102 1.3.11 访问者模式106

1. 设计模式(超级详细) 内容简介 有感于设计模式在日常开发中的重要性,同时笔者也自觉对设计模式小有心得,故笔者*写二十三种设计模式的简单例子、 并整理二十三种设计模式的理论部分,综合汇总成这份Java设计模式(疯狂J*va联盟版),希望对大家有所帮助。 本份帮助文档主要是为了向读者介绍二十三种设计模式,包括模式的描述,适用性,模*的组成部分,并附带有简单的例 子和类*,目的是为了让读*了解二十三种*计模式,并能方便的查阅各种设计模*的用法及注意点。 所附的例子非常简单,慢慢的引导读者从浅到深了解设计模式,并能从中享受设计的乐趣。 由于每个人对设计*式的理解都不尽一致,因此,可能本文档的例子*有不恰当的地方,还望各位读者指出不恰当的地方。 欢迎登录疯狂J*va联盟进行技术交流,疯狂Java联盟的论坛宗旨是: 所有的技术发帖,均有回复。 疯狂Java联盟网址: 笔者简介

设计模式及优点总结

桥接模式——Bridge 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何 意义。实现指的是抽象类和它的派生类用来实现自己的对象。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们独自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 桥接模式的结构图如下: 将抽象部分与它的实现部分分离,这不是很好理解,我的理解就是实现系统可能有很多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。也就是说,在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放—封闭原则时,就应该要考虑桥接模式。 单例模式——Singleton 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。 单例模式的结构图如下:

单例模式因为Singletion类封装它的唯一实例,这样它可以严格控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。 当在多线程情景下使用时,需要对GetInstance全局访问点加锁。适配器模式(Adapter) 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼 容而不能一起工作的哪些类可以一起工作。 也就是说系统的数据和行为都是正确的但接口不符时,我们应该考虑用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如说需要对早期代码复用一些功能等应用上很有实际价值。 适配器又两种类型,类适配器模式和对象适配器模式。但由于类适配器通常是通过多重继承实现的,而C#、https://www.360docs.net/doc/8a10665014.html,、JAVA等语言都不支持多重继承,也就是一个类只有一个父类,所以,我们这里主要讲对象适配器。 适配器模式的结构图如下:

关于23种设计模式新解

关于23种设计模式新解 创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你” builder。(这一定比美军在伊拉克用的翻译机好卖) 建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的

细节。建造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的 MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。 工厂方法模式:核心工厂类不再负责所有产品的创建,而是将 具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给 出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例 化这种细节。 4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里 面就行了,这就是我的情话prototype了。(100块钱一份,你要 不要) 原始模型模式:通过给出一个原型对象来指明所要创建的对象 的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有 任何事先确定的等级结构,原始模型模式适用于任何的等级结构。 缺点是每一个类都必须配备一个克隆方法。 5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,

23种设计模式额形象比喻 (1)

1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM 爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM 到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好

相关文档
最新文档