
浅显易懂的设计模式
文章平均质量分 92
GoF的《设计模式》实在有些晦涩难懂,所以我打算用一些简单的示例及浅显易懂地讲解,让更多的人开始了解一个程序员必须学习的一门课程——设计模式。
-飞鹤-
喜欢音乐,喜欢文学,喜欢跑步,喜欢编程!
展开
-
设计模式总结
OOP基础。OOP有三大目标,重用性、灵活性和扩展性。OOP有三大特性,封装、继承和多态。抽象虽然不是OOP的编程特性,但它却是所有编程语言的最大特性。封装,隐藏程序的属性和的实现细节,并控制属性的访问权限,对外仅提供接口。继承,是对基类的代码进行利用并扩展基类,是一个从一般到特殊的过程。多态,运行时,根据对象的不同,同一原创 2014-05-20 23:12:34 · 2556 阅读 · 0 评论 -
设计模式24——行为型模式之访问者模式
定义:访问者模式(Vistor Pattern),表示一个作用于对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。类型:对象行为型模式。概述: 访问者模式适用的场合比较狭窄,因为它的要求非常严。ConcreteElement要求具有一样的算法接口,并且ConcreteVisitor也要求一样的接口,这两点就使得访问者模式的使原创 2014-04-20 22:33:57 · 1342 阅读 · 0 评论 -
设计模式23——行为型模式之模板方法模型
定义:模板方法模式(TemplateMethod Pattern),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模块方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。类型:类行为型模式概述: 模板方法模式应该算是所有设计模式中最简单,却也是应用得最多的模式了。模板方法模式其实就是多态的体现。 模板方法模式设计的要点原创 2014-04-20 22:22:55 · 1259 阅读 · 0 评论 -
设计模式22——行为型模式之策略模式
定义:策略模式(Strategy Pattern),定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。类型:对象行为型模式。概述: 策略模式是比较典型的对象行为型模式,它是将对处理对象的一系列不同算法都单独抽离出来,单独封装成一个个类。策略的出现,主要是为了解决不同算法替换时的逻辑判断,将逻辑判断移到Client中原创 2014-03-23 23:01:53 · 1155 阅读 · 0 评论 -
设计模式21——行为型模式之状态模式
定义:状态模式(State Pattern),允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。类型:对象行为型模式概述: 一个对象有一个状态,那么每一个状态又对应一些相应的行为。如果这个对象有很多状态,那么就要对应非常多的行为。那么对这些状态的判断以及根据状态完成相应的行为,会非常复杂。并且如果想添加一种新的状态时,需要修改很多的现有代码。这原创 2014-03-13 00:27:06 · 1410 阅读 · 0 评论 -
设计模式20——行为型模式之观察者模式
定义:观察者模式(ObserverPattern),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。类型:对象行为型模式概述: 观察者模式也是比较难以理解,单看类图,会发现观察者模式与中介模式非常相似。如果不真正理解他们二者之间的区别,是难以真正理解观察者模式的。如果不理解观察者模式,更奢谈运用观察原创 2014-03-12 00:02:20 · 1464 阅读 · 0 评论 -
设计模式19——行为型模式之备忘录模式
定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。类型:对象行为型模式。概述: 备忘录模式使用的范围比较窄,即比较复杂的状态需要恢复到之前的状态。现实更多的情况只有很简单的状态需要恢复,如果用备忘录模式有点大材小用的感觉。就像用大炮打蚊子,原创 2014-03-08 20:04:10 · 1552 阅读 · 0 评论 -
设计模式18——行为型模式之中介者模式
定义:中介者模式(MediatorPattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。类型:对象行为型模式概述: 面向对象编程,鼓励将行为分散到对象当中。这样的好处,增强对象的可复用性,但是带来的负面作用是,当多个对象交互时不可避免地会带来耦合性的大大提升。原创 2014-03-07 21:09:39 · 1342 阅读 · 0 评论 -
设计模式17——行为型模式之迭代器模式
定义:迭代器模式(IteratorPattern),提供一种方法顺序访问一个聚合对象中各个元素,而又暴露无遗该对象的内部表示。类型:对象行为型模式概述: 正如定义所言,迭代器是为解决更好的访问一个聚合对象中的各个元素而产生的。迭代器是对象行为模式,也即它主要是通过将对象中的访问行为提取出来作为迭代器类。迭代器的产生,主要是为了解决客户端对聚合对象内部元素访问时可能造成的耦合。原创 2014-02-26 18:17:24 · 1305 阅读 · 0 评论 -
设计模式16——行为型模式之解释器模式
定义:解释器模式(InterpreterPattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。类型:类行为型模式概述: 正如GoF所介绍的,解释器模式的应用场合比较窄。解释器模式在《Head First Design Pagtterns》中也被列为非常用模式。解释器模式虽然说更多应用在某种语言上,但是原创 2014-02-19 21:37:18 · 1522 阅读 · 0 评论 -
设计模式15——行为型模式之命令模式
定义:命令模式(Command Pattern),将一个请求封闭成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排除或记录请求日志,以及支持可撤销的操作。类型:行为型模式。概述: 命令模式,被《Head First设计模式》列为常见的设计模式之一,而且光看类图,感觉很简单。可是真正要去运用的时候,往往会发现无从下手。因为你不知道什么时候该使用命令模式。任何关原创 2014-02-15 16:27:05 · 1214 阅读 · 0 评论 -
设计模式14——行为型模式之职责链模式
定义:职责链模式(Chain OfResponsibility Pattern),使从个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理安为止。类型:行为型模式。概述: 职责链模式,行为型模式,说明其主要是通过行为来表现的。这里的行为,也可以理解为方法(Method)。职责链模式,将一堆处原创 2014-01-22 11:17:26 · 1225 阅读 · 0 评论 -
设计模式13——结构型模式之代理模式
定义:代理模式(ProxyPattern),为其他对象提供一种代理以控制对这个对象的访问。类型:结构型模式分类:远程代理,为一个对象在不同的地址空间提供局部代表。虚代理,根据需要创建开销很大的对象。保护代理,控制对原始对象的访问。智能指引,取代简单指针,在访问时执行一些附加操作。概述:远程代理,如代理商,什么区域代、省代之类的都算原创 2014-01-21 01:26:43 · 1460 阅读 · 0 评论 -
设计模式12——结构型模式之享元模式
定义:享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。类型:结构型模式。适用情况:一个应用程序有大量的对象。对象的大多数状态都是外部的。如果删除对象的外部状态,可以和相对较少的共享对象取代很多组对象。应用程序不依赖对象的标识,即应用程序依赖于对象的抽象接口。概述: Flyweight,原意为“轻量级选手”的意原创 2014-01-20 11:27:37 · 1981 阅读 · 0 评论 -
设计模式11——结构型模式之外观模式
定义:外观模式(Façade Pattern),为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。类型:结构型模式。适用性:当子系统非常复杂时,使得客户调用非常麻烦,不便于使用。这个时候就可以使用外观模式将这些子系统封装起来,提供一个统一而简单接口供客户端使用。当需要构建一个层次结构的子系统时,使原创 2014-01-19 18:58:29 · 1102 阅读 · 0 评论 -
设计模式10——结构型模式之装饰者模式
定义:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。类型:结构型模式。类图: 参入者:Component,抽象类,只是提供接口。Model,一个具体对象,实现接口完成一些基本的功能。Decorator,有一个指向Component的指针,并且实现了Componet的接口。Hai原创 2014-01-18 19:21:41 · 1223 阅读 · 0 评论 -
设计模式9——结构型模式之组合模式
定义:组合模式(CompositePattern),将对象组合成树形结构以表示“部分—整体”的层次结构。“Composite”使得用户对单个对象和对组合对象的使用具有一致性。类型:结构型模式。类图:参与者:Computer,客户端,选择是否添加USB设备。USBDevice,所有USB设备的抽象类,提供USB设备的基本通信接口。USBMouse,单个对象原创 2014-01-14 17:59:38 · 1771 阅读 · 0 评论 -
设计模式8——结构型模式之桥接模式
定义:桥接模式(BridgePattern),将抽象部分与它的实现部分分离,使它们都可以独立地变化。类型:结构型模式。类图:参与角色:Clinet,客户指定组装电脑,指定了最初的接口。Computer,电脑抽象类,指定了具体安装CPU的接口。DesktopComputer,具体的台式机电脑,根据主板型号具体实现如何安装CPU。原创 2014-01-13 00:56:26 · 912 阅读 · 0 评论 -
设计模式7——结构型模式之适配器模式
定义:适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。类型:结构型模式。适用性:你想使用一个已经存在的类,而它的接口不符合要求。你想创建一个可以复用的类,该类可以与其他接口不兼容的类协同工作。你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。可以使用对象适原创 2014-01-12 02:24:18 · 1117 阅读 · 0 评论 -
设计模式6——创建型模式之原型模式
定义:原型模式(Prototype Pattern),用原型模式指定创建对象的种类,并且通过拷贝这些原型创建新的对象。类型:创建型模式。类图: 参与角色:CPrototype,抽象原型基类,提供一个Clone的接口以及一些设置显示的接口。CConcretePrototype,声明定义原型的相关参数,并实现Clone接口,主要是通过实现拷贝构造函数来完原创 2014-01-12 01:05:52 · 1204 阅读 · 1 评论 -
设计模式5——创建型模式之建造者模式
定义: 建造者模式(Builder Pattern), 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。类型:创建型模式。类图: 参与角色:Product,定义了一组产品的部件,并且有一个方法来表示对象。Builder,提供一系列Product对象每个部件构成的接口。BuilderA、BuilderB通过实现父类的接口来完成产原创 2014-01-12 01:00:25 · 895 阅读 · 0 评论 -
设计模式4——创建型模式之单例模式
定义:单例模式(SingletonPattern),保证一个类仅有一个实例,并提供一个访问它的全局访问点。类型:创建型模式类图:概述: 在很多比较大型的程序中,全局变量经常被用到。如果不用全局变量,那么在使用到的模块中,都需要用参数将全局变量传入,这是非常麻烦的。虽然要减少使用全局变量,但是如果需要,还是要用。单例模式就是对传统的全局的一种改进。原创 2014-01-12 00:59:31 · 722 阅读 · 0 评论 -
设计模式3——创建型模式之抽象工厂模式
定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需要指定它们具体的类。类型:创建型模式。类图: 参与角色: 1. FeaturePhone、SmartPhone,分别是功能手机和智能手机的两个抽象类,分别抽象出来了功能机的制造流程,智能机的制造流程。 2. NokiaFeaturePhone原创 2014-01-12 00:58:34 · 882 阅读 · 0 评论 -
设计模式2——创建型模式之工厂方法模式
定义:工厂方法模式(FactoryMethod Pattern),定义一个用于创建对象的接口,让子类决定实例化哪一个类。定义一个抽象工厂类,每一个产品,按照抽象工厂的基本要求新建一个工厂来生产新的产品。类型:创建型模式。类图:参与角色:AbstrctProduct,提供产品生产的标准接口。ConcreteProductA,ConcreteProd原创 2014-01-12 00:57:20 · 843 阅读 · 0 评论 -
设计模式1——创建型模式之简单工厂模式
定义:简单工厂模式(Simple Factory Pattern),有一个提供接口的抽象类,然后实现不同功能的子类去实现抽象类,最后一个简单工厂类来完成对不同功能子类的创建。类型:创建型模式。类图: 参与角色:抽象产品,提供接口供Client调用。具体产品,根据具体产品的要求去实现接口。工厂类,根据传入参数的不同,创建不同的产品。概述:原创 2014-01-12 00:56:34 · 971 阅读 · 0 评论 -
设计模式六大原则
开闭原则(Open Closed Principle)定义:软件实体应该对扩展开放,对修改关闭。由来:一些软件生命周期很长,必然面临维护升级等变化。而新添加的代码很容易对旧有的代码造成影响,甚至给旧有的代码带来Bug。解决:当软件代码需要进行变动时,尽量以添加新的代码来完成,而不去修改原有的代码。也即通过扩展来完成所需要的功能的添加。 里氏替换原则(Lisk原创 2014-01-12 00:52:25 · 824 阅读 · 0 评论