设计模式
冯索
形成好习惯,走好人生路。
展开
-
23种设计模式基本介绍
——可复用面向对象软件的基础设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现转载 2014-03-06 10:59:26 · 722 阅读 · 0 评论 -
责任链模式(chain)—员工请假
定义:责任链模式是对象的行为模式,在责任链模式里,很多对象由每一个对象对其下家的引用而链接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道哪一个对象处理此请求,这使得系统在不影响客户端的情况下动态的重新组织和分配责任。角色列表:抽象处理者角色(Handler):定义出一个处理请求的接口或者抽象类,如果需要,接口可以定义出一个方法以设定原创 2016-01-21 13:53:57 · 1534 阅读 · 0 评论 -
命令模式(Command)—挤奶工挤奶
定义:命令模式属于对象的行为模式,又叫行动模式、交易模式。命令模式把一个请求或者操作封装到一个对象中,命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。角色:客户端(Client)角色:创建一个具体命令对象(ConcreteCommand),并确定接收者。命令(Command)角色:声明一个给所有具体命令对象的接口。具体原创 2016-01-22 18:23:10 · 660 阅读 · 0 评论 -
模板模式(Template)-水泥厂订货
模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 T模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。角色:抽象类(AbstractClass): 定义抽象的原语操作(primitive operation) ,具体的子类将重定义它们以实现一个算法, 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义具体子类 (Con原创 2016-01-07 15:13:58 · 851 阅读 · 0 评论 -
备忘录模式(Memento)—通风系统
定义:备忘录模式又叫做快照模式,或Token模式,是对象的行为模式。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象,其用意是在不破坏封装的前提下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候,将这个对象还原到存储起来的状态。角色:备忘录(Memento)角色:将发起人对象的内部状态存储起来。发起人(Originator)角色:创建一个含有当前的原创 2016-01-25 17:10:25 · 696 阅读 · 0 评论 -
观察者模式(Observer)—水泥厂发通知
观察者模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。类图角色抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察原创 2016-01-08 13:59:50 · 1172 阅读 · 0 评论 -
门面模式(Facade)(外观模式)—向养牛场送货
门面模式 :为子系统构建与外部系统交互的统一界面。门面模式的优点,我认为有两点: 1:解耦各个子系统,减少子系统与外部系统调用时的频繁调用, 2:屏蔽子系统内的方法,这样就可以尽量少的向外部系统暴露方法。例子:向养牛场送货类图;Facade角色:Guard门卫,负责与内部系统的交互,即与仓库保管员与兽医站人员的交互子系统角色:Verterinary兽原创 2015-12-08 15:26:58 · 595 阅读 · 0 评论 -
合成模式(Composite)-山下的养牛场
合成模式:描述整体与部分的关系,将对象组织到树结构中,最典型的是文件与文件夹系统,分为安全式与透明式。例子:我家有座山,山下有个养牛场,牛分奶牛与黄牛,每头牛都有编号安全式:类图:抽象构建角色 Cattle类package composite2;/** * 合成模式 安全模式 * 山下牛场里的牛群图 * 抽象构建牛 * @author wang *原创 2015-12-07 18:26:37 · 442 阅读 · 0 评论 -
状态模式(State)—考勤系统
定义:状态模式是对象的行为模式,允许一个对象在其内部状态改变时改变他的行为,这个对象看上去就像改变了他的类一样。角色:环境(Context)角色:原创 2016-01-27 11:35:52 · 2184 阅读 · 0 评论 -
享元模式(FlyWeight)—山上打井
享元模式:使用共享来避免许多相同对象的内存开销。类图:包括三个角色:抽象享元角色(FlyWeight):给出抽象类或者抽象接口,规定具体享元类的实现方法。具体享元角色(Concrete):实现抽象享元角色,如果有内蕴状态,给出存储空间。享元工厂角色(FlyWeightFactory):负责管理与创建享元角色。在客户端调用享元对象时,如果系统中存在符合要求的享元对象,就会原创 2015-12-09 16:25:17 · 892 阅读 · 0 评论 -
访问者模式(Visitor)
设计模式 访问者模式原创 2017-03-20 23:17:54 · 399 阅读 · 0 评论 -
解释器模式(interpreter)
定义:一种按照规定语法进行解析的方案类图:角色1.AbstractExpression抽象解释器:具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和NonterminalExpression2.TerminalExpression终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结表达式,但有多个实原创 2017-05-06 00:54:01 · 500 阅读 · 0 评论 -
装饰模式(Decorator)-山下的石雕厂
装饰模式:是对一个类进行各种功能的丰富,使用Decorator模式扩充类的功能会比用子类生成的方式更加的灵活。装饰者与被装饰者拥有共同的超类。类图: 我家有座山,山下有座石雕厂,石雕厂有打磨石狮子的机器 抽象构建角色(被装饰者):石雕厂Carved类 具体构建角色(被装饰者的初始状态):雕刻石狮子LionCarved 装饰角色(持有构件的实例):机器原创 2015-12-02 20:02:31 · 377 阅读 · 0 评论 -
迭代器模式(Iterator)—牛群体检
定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。角色列表:迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。具体迭代器角色(ConcreteIterator):具体迭代器角色实现迭代器接口,并记录当前的遍历位置。容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。具体容器角色(ConcreteCo原创 2016-01-20 18:37:13 · 550 阅读 · 0 评论 -
单例模式(Singleton)
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一转载 2014-03-06 16:25:56 · 595 阅读 · 0 评论 -
建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:[java] view plaincopy转载 2014-03-06 16:47:11 · 567 阅读 · 0 评论 -
工厂方法模式
工厂方法模式分为三种:11、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:举例如下:(我们举一个发送邮件和短信的例子)首先,创建二者的共同接口:[java] view plaincopypublic interface Sender { public void Se转载 2014-03-06 11:38:02 · 691 阅读 · 0 评论 -
抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。请看例子:请看例子:转载 2014-03-06 11:54:05 · 598 阅读 · 0 评论 -
原型模式(Prototype)
原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的,先创建一个原型类:[java] view plaincopypublic class Prototype implements C转载 2014-03-06 17:15:07 · 651 阅读 · 0 评论 -
设计模式概论
1. 设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 模式的经典定义:每个模式转载 2015-09-08 18:48:20 · 426 阅读 · 0 评论 -
代理模式(Proxy)—山下的水泥厂
代理模式:提供一个代理对象,当原对象被调用时,通过代理对象调用,代理模式起在客户端与原对象中间起到中介的角色。分为三部分角色:抽象对象角色(AbstractObject):声明目标对象与代理对象的抽象接口或类,方便委派具体对象角色(RealObject):定义真正的对象角色代理对象角色(ProxyObject):代理对象含有对具体对象的引用,并持有对具体对象的接口,代理对象一般都会原创 2015-12-10 14:29:50 · 1080 阅读 · 0 评论 -
适配器模式Adapter(结构型)
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。 例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器。可以使用这个电源适配器充电。这个iphone的电源适配器转载 2015-11-24 19:05:42 · 585 阅读 · 0 评论 -
桥连模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?例子1:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:•第一种转载 2015-11-25 18:29:09 · 623 阅读 · 0 评论 -
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
类与类图1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。3) 类的属性即类的数据职责,类的操作即转载 2015-11-26 14:07:14 · 392 阅读 · 0 评论 -
策略模式(Strategy)—养牛场卖鲜奶
策略模式:策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式的三个角色:环境(Context)角色:持有一个Strategy的引用。抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口原创 2015-12-31 16:05:01 · 713 阅读 · 0 评论 -
调停者模式(Mediator)
定义:调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。类图:角色:抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法原创 2017-05-07 00:54:41 · 1436 阅读 · 0 评论