![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 84
第二月
这个作者很懒,什么都没留下…
展开
-
迭代器模式/Iterator
迭代器模式/Iterator意图/适用场景:迭代器模式的应用在Java语言中司空见惯。迭代器(Iterator)与聚集(Aggregate)的概念密不可分。聚集是能够包容一组对象的容器对象,不同种类的聚集组织这些对象的方式是不同的,即拥有不同的结构。Java语言对聚集有良好的支持,Java聚集对象是实现了共同的java.util.Collection接口的对象,包括Vector、A原创 2013-08-27 12:00:49 · 777 阅读 · 0 评论 -
桥梁模式/Bridge
桥梁模式/Bridge意图/适用场景:桥梁模式的意图在于把“抽象”与“实现”解耦合,把强关联转变为弱关联。所谓强关联,就是在编译时期已经确定的,无法在运行时期改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。显然,在Java语言中,继承关系是强关联,而聚合关系是弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改为弱关联。因此,桥梁模式原创 2013-08-27 12:00:23 · 845 阅读 · 0 评论 -
门面模式/Facade
门面模式/Facade意图/适用场景:设计师处理很杂系统的一个常见方法是“分而治之”,把一个系统划分为几个较小的子系统,每个子系统提供一种单一的服务。这样做之后,可能会出现大量的子系统,客户端往往要同时与很多子系统打交道之后才能达到目的。门面模式创造出一个门面对象,将客户端所涉及的具体子系统数目减至最小,使用客户端与众多了系统的相互作用被门面对象所取代。显然,门面模式是实现代码重构以原创 2013-08-27 12:00:21 · 845 阅读 · 0 评论 -
享元模式/Flyweight
享元模式/Flyweight意图/适用场景:享元模式也叫轻量模式(flyweight pattern),因应用大量轻量级对象而得名。Flyweight模式对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模。例如,文档编辑器可以为字母表中的每一个字母创建一个flyweight。每个flyweight存储一个字符代码,但它在文档中的位置和排版风格可以在字符出现时由正文排版算法和使原创 2013-08-27 12:00:19 · 628 阅读 · 0 评论 -
装饰模式/Decorator
装饰模式/Decorator意图/适用场景:装饰模式将更多的功能动态地附加到一个对象上。对功能扩展而言,装饰模式提供了一个灵活的、可以替代“继承”的选择。装饰模式通过被装饰类的一个子类的实例,把客户端的调用委派到被装饰类。在以下情况下应当使用装饰模式:需要扩展一个类的功能,或给一个类增加责任。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。需要增加同一些基本功原创 2013-08-27 12:00:14 · 692 阅读 · 0 评论 -
合成模式/Composite
合成模式/Composite意图/适用场景:合成模式又叫做部分-整体模式。它将对象组织到树结构中,可以用来描述整体与部分的关系。最显著的特点就是把整体与部分都抽象出统一的接口,这样客户端就可以把单纯元素与复合元素同等看待。看下图所示的树状结构图。图中有两种节点,一种是树枝节点,一种是树叶节点。树根也是一种树枝节点,只不过它比较特殊,它没有父节点。在构建这样的一种树状结构里,合成模式原创 2013-08-27 12:00:12 · 797 阅读 · 0 评论 -
缺省适配模式/Default Adapter
缺省适配模式/DefaultAdapter意图/适用场景:缺省适配模式为一个接口提供缺省实现,这样了类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。当原接口中定义的方法太多,而其中大部分又不被需要时,这种模式非常实用。由缺省适配器类直接实现接口,并为所有方法提供缺省的空实现。用户类就只需要继承适配器类,只实现感兴趣的方法就行了。Java的WindowAdapter就是一原创 2013-08-27 12:00:10 · 882 阅读 · 0 评论 -
适配器模式/Adapter
适配器模式/Adapter意图/适用场景:适配器模式用于对已有代码的重用。如果客户端需要某一种接口(Target)的实现类,但系统中并没有一模一样的类。系统中已有的某种接口或者类(Adaptee)与所要求的接口(Target)有相同或相近的功能,只需要改变接口名或稍做一些修改就可以重用。适配器模式正适合做这种重用。适配器模式分为“类适配模式”和“对象适配模式”两种,下面分别描述原创 2013-08-27 12:00:08 · 738 阅读 · 0 评论 -
不变模式/Immutable
不变模式/Immutable意图/适用场景:“不变类”是这样一个类,它的内部状态创建后,在整个生命期间都不会发生变化。使用不变类的做法叫做不变模式。不变类允许被多个对象共享,降低了对该对象进行并发访问时的同步化开销。如果需要修改一个不变对象的状态,那么就需要建立一个新的同类型对象,并在创建时将这个新的状态存储在新的对象里。不变模式有两种形式:弱不变模式,以及强不变模式。弱不变原创 2013-08-27 12:00:25 · 794 阅读 · 0 评论 -
策略模式/Strategy
策略模式/Strategy意图/适用场景:策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以互换。这样做的好处是,客户端可以以插件的方式更换算法。电子商务网站的购物车系统是一个策略模式非常适用的场景:比如,在优惠方式上,某一类商品是每件优惠一元,另一类商品是折扣5%,还有一类商品也是打折,但折扣幅度是10%。所以需要应用不同的优惠算法来计算最终的价格。原创 2013-08-27 12:00:28 · 701 阅读 · 0 评论 -
观察者模式/Observer
观察者模式/Observer意图/适用场景:观察者模式的目的在地,当某一个对象(被观察者)的状态发生变化的时候,其它想要知晓这一改变的对象(观察者)能够得到通知。能够实现这一点的设计方案有很多,但是为了使系统易于复用,应该选择低耦合度的设计方案。UML:参与者:抽象观察者(Observer):所有观察者的公共接口。定义一个更新方法(即update()方法),当所观察的原创 2013-08-27 12:00:30 · 1023 阅读 · 0 评论 -
模版方法模式/Template Method
模版方法模式/TemplateMethod意图/适用场景:模版方法模式其实是一种应用很广泛的模式,特别是在使用抽象类的时候。模版方法模式中必然有一个核心的抽象类,不能是接口。声明一些抽象方法,这些方法由子类来做各不相同的实现;也可以是一些非抽象的方法,这些方法只是做为默认的实现,子类应该覆盖它们。此外,还要定义一个或多少具体的方法,它们实现一些逻辑,调用前面提到的抽象或非抽象方法原创 2013-08-27 12:00:47 · 672 阅读 · 0 评论 -
中介者模式/Mediator
中介者模式/Mediator意图/适用场景:中介模式的用意是用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会原创 2013-08-27 12:00:45 · 674 阅读 · 0 评论 -
解释器模式/Interpret
解释器模式/Interpret意图/适用场景:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式并不是一种应用很广泛的模式,因为它特别适合用来解释语言,而在一般的软件系统中,内嵌一种语方的成本显然太高。但这种模式的出发点值得借鉴:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。原创 2013-08-27 12:00:43 · 826 阅读 · 0 评论 -
访问者模式/Visitor
访问者模式/Visitor意图/适用场景:访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开来,使得操作集合可以相对自由地演化。数据结构的每一个节点者可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象而反过来执行节点对象的操作。这样的过程叫做“双重分派”。访问者模式的功能在于,你可以在不改变各元素的类的前提下定义作用于这些元原创 2013-08-27 12:00:40 · 881 阅读 · 0 评论 -
状态模式/State
状态模式/State意图/适用场景:状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了它的类一样。在两种情况下均可以使用状态模式:一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。状态模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将原创 2013-08-27 12:00:38 · 816 阅读 · 0 评论 -
备忘录模式/Memento
备忘录模式/Memento意图/适用场景:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并存储起来。在将来合适的时候把这个对象还原到存储时的状态。UML:参与者:发起人(Originator):需要保存自身状态的对象。它有两个功能,一是创建新的备忘录,一是恢复到已有的备忘录。管理者(Car原创 2013-08-27 12:00:36 · 777 阅读 · 0 评论 -
命令模式/Command
命令模式/Command意图/适用场景:命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是被谁处理、是否被处理、何时处理以及怎么处理。命令模式有以下原创 2013-08-27 12:00:34 · 731 阅读 · 0 评论 -
责任链模式/Chain Of Re…
责任链模式/ChainOf Responsibility意图/适用场景:在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理了这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。UML:Of Responsibility" TIT原创 2013-08-27 12:00:32 · 631 阅读 · 0 评论 -
原型模式/Prototype
原型模式/Prototype意图/适用场景:原型模式即是由一个已有的对象复制出一个相同的对象。这是一种对象的创建模式,即由已存在的对象动态构造新的对象。这种方法在面向对象的语言中已经应用得非常普遍,比如Java中的clone()方法以及C 中的拷贝初始化等等。不再详细描述。原创 2013-08-27 12:00:06 · 741 阅读 · 0 评论 -
建造模式/Builder
建造模式/Builder意图/适用场景:如果一个产品由很多的配件组成,缺少了其中某一个配件,产品都不能工作。产品只有在所有配件都装配完成的情况下才能正常工作。对于这样的产品,不希望外界干预它的生产过程,在外界看来,生产者只提供完整的产品,而不提供任何的中间过程信息。这就是一个建造模式的应用场景。建造模式的另一个方面在于,系统还提供不同的生产者,它们生产不两只的产品,但同样都不提供内部信原创 2013-08-27 12:00:04 · 634 阅读 · 0 评论 -
单例模式/Singleton
单例模式/Singleton意图/适用场景:在很多情况下,希望某个类在整个系统中只有一个实例。比如像Windows系统的控制面板,还有Ubuntu系统里的软件管理器。这样的实例往往控制了某种唯一的资源,如果有多个实例同时工作的话,会造成混乱。当然,实例的使用者可以提醒自己不要构造多个实例,但这并不是一个好办法,实例的唯一性不能得到保障。最好的办法是由这个类自己来保障实例的唯一性,即使使原创 2013-08-27 12:00:02 · 515 阅读 · 0 评论 -
合成模型模式
合成模型模式属于对象的结构模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系,合成模式可以使客户端将单纯元素与复合元素同等看待。 在合成模式的树结构中,有两种节点,一种是无子节点的树叶节点,一种是有子节点的树枝节点。树枝节点是本模式的核心,可称为合成类。在整个合成模式的类结构中,除了两种节点外,还有它们的公共抽象接口。 合成模式所涉及到的主要内容就是把不同原创 2006-11-16 11:59:00 · 1041 阅读 · 0 评论 -
缺省适配模式
在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,这个具体类要实现所有的方法,那些有用的方法要有实现,那些没有用的方法也要有空的、平庸的实现。这些空的方法是一种浪费,有时也是一种混乱。 适配器模式可以很好地处理这一情况。可以设计一个抽象的适配器类实现接口,此抽象类要给接口所要求的每一种方法都提供一个空的实现,原创 2006-11-15 11:09:00 · 1543 阅读 · 0 评论 -
适配器模式
适配器模式的用意是将接口不同而功能相同或者相近的两个接口加以转换。 适配器模式中存在三个角色:一是目标Target,它是目标接口,最近得到的类要具有它的接口形式;二是被适配的源类Adaptee,它的功能与Target所描述的接口有相似的地方,但是它无法成为Target的实现类,所提供的方法不全,或者不完全符合要求;三是适配器类Adapter,它的功能是把Adaptee原创 2006-11-14 12:27:00 · 896 阅读 · 0 评论 -
原始模型模式
原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。 原始模型模式最成功的应用之一就是Object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一原创 2006-11-13 17:21:00 · 1147 阅读 · 0 评论 -
抽象工厂模式
抽象工厂模式特别适合于这样的一种产品结构:产品分为几个系列,在每个系列中,产品的布局都是要同的,在一个系列中某个位置的产品,在另一个系列中一定有一个对应的产品。这样的产品结构是存在的,这几个系列中同一位置的产品可能是互斥的,它们是针对不同客户的解决方案,每个客户都只择其一。比如Linux与Windows系统下的界面控件,可以从两个交叉的角度来看,从组件的角度看,可以分为linux的原创 2006-11-06 17:32:00 · 780 阅读 · 0 评论 -
建造模式
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附件等部分,而在最起码的收件人地址得到赋值之前,这个电子邮件不能发出。 还有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质无法赋值。这些情况使得性质本身的建造涉及到复杂的商原创 2006-11-08 16:17:00 · 908 阅读 · 0 评论 -
单例模式
单例模式有三个要点:一是此类只能有一个实例;二是它必须自行创建这个实例;三是它必须自动向整个系统提供这个实例。 Java的单例类有以下两种模型:1、饿汉式单例类 有一个静态成员,是指向本类的句柄,它也将是这个类的唯一一个实例。这个句柄在一开始就被初始化,也就是说这个单例被早早地准备好了;构造函数是私有的,这样可以保证除了它自己,没有任何类可以构造它的实例原创 2006-11-07 15:22:00 · 919 阅读 · 0 评论 -
工厂方法模式
工厂方法模式的特点是,各产品类实现统一的接口,工厂类有多个,也实现统一的工厂接口,每一种具体产品都对应有一个具体工厂类,每一个工厂类只生产一种产品。产品系列的结构与工厂系列的结构是完全一致的。这样设计的好处是,当加入新的产品时,不用对已有的代码做改动,只要加入新的产品类和对应的工厂类就行了。package factorymethod;/* 水果类的接口,声明了种植、生长和收获三个方法 */原创 2006-11-03 12:09:00 · 961 阅读 · 0 评论 -
装饰模式
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。 装饰模式中有以下角色:Component:给出一个抽象接口,以规范准备接收附加责任的对象;ConcreteComponent:被装饰者,本模式的目的就是把它的行为做动态的扩展;Decora原创 2006-11-20 11:47:00 · 853 阅读 · 0 评论 -
代理模式
假设一个系统已经有一个对象A,现在需要向这个系统加入一个新的对象C。对象C需要使用系统中已有的对象A,但是C不能像系统一在使用A这样使用A,要么是A提供的接口不符合C的要求,要么是A的功能需要进一步加强等。 这时候可以选择修改对象A,也可以选择使用一个中介对象B,让对象B将调用传递给对象A。这样新的对象C使不必直接与系统中已有对象A打交道,而是通过对象B与A打交道原创 2006-11-22 10:56:00 · 1077 阅读 · 0 评论 -
享元模式
享元模式是对象的结构模式,它以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态和外蕴状态。 一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而改变的,因此一个享元可以具有内蕴状态并可以共享。 一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由由端保存,并在享元对象被创建之后,在需要使用的时候再原创 2006-11-27 15:32:00 · 1070 阅读 · 0 评论 -
抽象工厂模式/Abstract Factory
抽象工厂模式/AbstractFactory意图/适用场景:抽象工厂模式适用于这样一种场景:产品是成系列的,每一个系列的产品由多个不同的产品组成,这些产品有一些相似的特性,比如属于同一色系。每一种产品又有很多种类,这些不同的产品可用一个产品继承树来表示。系统中存在多个产品系列,但每次只需要产生一个系列出来工作,其它则不用。总结以上的需求,产品类有这样的一种结构:每一原创 2013-08-27 12:00:00 · 594 阅读 · 0 评论 -
工厂方法模式/Factory Method
工厂方法模式/FactoryMethod意图/适用场景:工厂类定义一个用于创建产品对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。这一模式的特征是工厂类的子类继承树与产品类的子类继承树有一一对应的关系。在下列情况下可以使用Factory Method模式:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来原创 2013-08-27 11:59:57 · 544 阅读 · 0 评论 -
简单工厂模式/Simple Factory
简单工厂模式/SimpleFactory意图/适用场景:如果系统中存在众多的产品类,而且这些产品类都可以抽象出统一的接口,简单工厂模式就可能会适用。使用者不必自己去创建每一个产品类的实例,创建工作可以统统交给一个工厂类的实例来完成。使用者只需告诉工厂类所要创建的产品名字。UML:Factory" />参与者:抽象产品(Product):它是所有产品类的共有的接口,原创 2013-08-27 11:59:55 · 626 阅读 · 0 评论 -
简单工厂模式/Simple Factory
简单工厂模式/Simple Factory意图/适用场景:如果系统中存在众多的产品类,而且这些产品类都可以抽象出统一的接口,简单工厂模式就可能会适用。使用者不必自己去创建每一个产品类的实例,创建工作可以统统交给一个工厂类的实例来完成。使用者只需告诉工厂类所要创建的产品名字。UML:参与者:抽象产品(Product):它是所有产品类的共有的接口,可原创 2011-11-06 11:46:04 · 1019 阅读 · 0 评论 -
策略模式
策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情况下发生变化。 策略模式中有三种角色:抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。具体策略(ConcreteStrateg原创 2006-12-05 12:41:00 · 1069 阅读 · 0 评论 -
不变模式
不变模式可增强对象的强壮性。不变模式允许多个对象共享某一对象,降低了对该对象进行并发访问时的同步化开销。如果需要修改一个不变对象的状态,那么就需要建立一个新的同类型对象,并在创建时将这个新的状态存储在新对象里。 不变模式只涉及到一个类。一个类的内部状态创建后,在整个生命期间都不会发生变化时,这样的类称做不变类。这种使用不变类的做法叫做不变模式。不变模式有两种形式:一种是弱不变原创 2006-12-01 11:18:00 · 2166 阅读 · 0 评论 -
桥梁模式
桥梁模式“将抽象化与实现化断耦,使得二者可以分别独立地变化”。桥梁模式本身并不是很容易理解,但如果把它和移植J2ME的MIDP时所遇到的Peer相联系起来,就觉得很有价值了。MIDP的标准类库是为用户提供的接口,在任何平台上都要保持一致,是不能变的,因而应该设计为抽象的,对平台无依赖性。以可视的控件为例,很多控件类都会有一个对应的Peer类,比如Form有FormPeer,Peer才是真正原创 2006-11-29 12:12:00 · 1185 阅读 · 0 评论