设计模式
文章平均质量分 93
1.介绍23种设计模式
2.对于各个设计模式,我的理解以及总结
3.各个设计模式写法的示例以及分析
4.参考《设计模式之禅》,以及其它书籍博客
阿飞__
熟悉 Android、C++ 等
展开
-
设计模式分类以及六大设计原则(汇总篇)
设计模式的分类创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰者模式、代理模式、门面模式(外观模式)、桥梁模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。扩展模式:规则模式...原创 2018-05-22 22:36:28 · 11982 阅读 · 0 评论 -
单例模式以及推荐写法(二)
一、定义确保一个类只有一个实例,并向整个系统提供这个实例。二、产生条件1.构造方法私有化2.提供一个共有的静态方法,返回该类的一个实例三、优缺点优点:1.减少内存开支,避免反复创建和销毁。2.只有一个实例,减少系统性能开销,特别是产生一个对象需要比较多的资源时。3.避免对资源的多重占用,例如写文件动作,只有一个实例存在可以避免对同一个资源文件的同时写操作。4.单例模式可以在系统设置全局的访问点,优...原创 2018-05-22 22:51:55 · 1215 阅读 · 0 评论 -
工厂方法模式与简单工厂模式(三)
一、定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延伸到其子类。二、优点 1.拥有良好的封装性。调用者需要一个具体产品,只需要向工厂获取,而不用知道创建对象的艰辛过程,降低模块间的耦合。 2.易于扩展。增加产品时,只需要适当修改具体的工厂类或者扩展一个工厂,甚至不用修改。 3.屏蔽产品类,解除耦合。产品类的实现如何变化,调用者都不需要关...原创 2018-05-26 15:30:21 · 4885 阅读 · 0 评论 -
抽象工厂模式详解(四)
一、定义 为创建一组相关或者相互依赖的对象提供一个接口,而且无须指定它们的具体类。 简单的说,抽象工厂模式是工厂方法模式的升级版本,当存在多个产品族时,产品族之间是存在相关或者依赖关系,可以使用抽象工厂来创建产品。二、实例分析 网上已经有很多关于宝马的抽象工厂的例子了,这里我们不在累述。抽象工厂的起源或是更早的应用,是为了用于创建分属于不同操作系统的视窗构...原创 2018-05-27 11:38:45 · 1958 阅读 · 2 评论 -
模版方法模式(五)
一、初步了解模版方法模式 假设需要定义一个汽车的模型,它有一些启动、引擎轰鸣、鸣笛、停止、行驶等方法。其中这个类可以定义如下:public abstract class CarModel { //首先,这个模型要能发动起来 public abstract void start(); //能发动,还要能停下来 public abstract void s...原创 2018-05-27 21:41:14 · 529 阅读 · 0 评论 -
建造者模式(六)
一、定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。二、角色 1.Product 产品类:建造者最后要构建出来的复杂对象。 2.Builder 抽象构建者:为创建一个复杂对象各个组建指定抽象接口,规范产品的组建。 3.ConcreteBuilder 具体建造者:实现抽象类返回的所有方法。 4.Director 导演类:执行者,指导构建过...原创 2018-06-02 14:07:21 · 725 阅读 · 0 评论 -
代理模式简介(七)
一、定义 为其它对象提供一种代理,以控制对这对象的访问。二、类图三、代理三要素 1.Subject 抽象主题角色(共同接口) 可以是抽象类或者接口,是一个最普通的业务类型定义,无特殊要求。public interface Subject { //定义一个方法 public void request();} 2.RealSubject 具体主题角色(真实对象...原创 2018-06-03 12:07:49 · 1112 阅读 · 0 评论 -
静态代理和动态代理(八)
一、代理模式 关于代理模式,以及代理模式的组成元素、类图关系、优点以及应用场景可以参考我的上一篇博文 代理模式简介二、静态代理1.定义 所谓静态代理,即是代码编译时已经写好了代理类。例如我们上一章介绍的例子就是静态代理。2.举个例子 现在又一个共有接口如下public interface ActionA { void action1(); void action2...原创 2018-06-03 12:28:07 · 524 阅读 · 1 评论 -
原型模式与浅复制深复制(九)
一、定义 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。原型模式是和单例模式一样很简单的一种设计模式。二、优点 1.性能优良 原型模式是在内存二进制流的拷贝, 要比直接new一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好地体现其优点。 2.避免了反复的相同赋值操作 例如有一个 Mail 类,现在创建了一个实例对象 ...原创 2018-06-07 09:15:51 · 665 阅读 · 0 评论 -
中介者模式(十)
一、引子1.场景模拟 假设有一家商店。采购员负责采购商品,销售负责出售商品,商店的库存负责存储商品。他们彼此都存在一定的依赖关系,那么他们之间的关系大致可以如下图描述:2.场景扩大 我们知道迪米特法则认为“每个类只和朋友类交流”,然而这个朋友类并非越多越好,朋友类越多,耦合性越大,想要修改一个就得修改一片。这不是我们所期望的。 上面那个场景还很简单,假如我们再扩大一点,引入供应商...原创 2018-06-10 09:15:01 · 586 阅读 · 0 评论 -
命令模式(十一)
一、定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求的日志,可以提供命令的撤销和恢复功能。 简单的说,命令模式是实现的 “行为请求者(Invoker)” 与 “行为实现者(Receiver)” 间的解耦,将请求封装成一个命令,调用者只需要执行相应的 “命令(Command)” 即可。二、类图和成员角色1. Receiver 接受者 该角...原创 2018-06-12 08:24:09 · 692 阅读 · 0 评论 -
责任链模式(十二)
一、引子 古代女子有“三从四德”之说,“三从”即指“未嫁从父、既嫁从夫、夫死从子”。也就是说,一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子。举例来说,如果一位女性要出去逛街,在她出嫁前必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?那就得问问儿子是否允许自己出去逛街。估计你接下来马上要问:“要是没有儿子怎么办?”那就请示小叔子、侄...原创 2018-06-13 13:20:49 · 2116 阅读 · 1 评论 -
装饰者模式(十三)
一、定义 动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰模式相比生成子类更为灵活。二、类图及各角色1. Component 抽象组件(公共接口/抽象类) 装饰者模式必须要有这样一个抽象的组件,被装饰者和装饰者都是这个抽象的具体实现。往往定义我们最核心、最原始、最基本的对象。public abstract class Component { //抽象的方法 p...原创 2018-06-14 08:43:32 · 707 阅读 · 0 评论 -
策略模式(十四)
一、定义 策略模式(Strategy pattern)也叫政策模式(Policy Pattern),其定义为:定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换。二、类图及角色1. Context 封装角色 类似于锦囊妙计的锦囊,它也叫做上下文角色, 起承上启下封装作用, 屏蔽高层模块对策略、 算法的直接访问,封装可能存在的变化。public class Context {...原创 2018-06-14 21:56:22 · 680 阅读 · 0 评论 -
适配器模式(十五)
一、定义 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括了之前的装饰者模式。 扩展: 适配器模式最开始的应用实在工业上,如下图A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致...原创 2018-06-16 14:55:58 · 806 阅读 · 0 评论 -
迭代器模式(十六)
一、定义 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。二、角色1. Iterator 抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first() 获得第一个元素,next() 访问下一个元素,isDone() 是否已经访问到底部(Java 叫做 hasNext() 方法)。public interface Iterator...原创 2018-06-16 16:28:07 · 496 阅读 · 0 评论 -
组合模式(十七)
一、定义 组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系,其定义如下: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。二、角色Component是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理C...原创 2018-06-17 09:12:44 · 805 阅读 · 0 评论 -
观察者模式(十八)
一、定义 观察者模式(ObserverPattern)也叫做发布订阅模式(Publish/subscribe),其定义如下: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。二、角色1. Subject 被观察者 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必...原创 2018-06-17 15:31:14 · 752 阅读 · 0 评论 -
门面模式/外观模式(十九)
一、定义 门面模式(FacadePattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。二、示意图 简单地说,门面对象是外界访问子系统内部的唯一通道,外部模块不用管子系统内部是多么复杂以及如何实现的。1. Facade 门面角色 客户端可以调用这...原创 2018-06-18 14:46:20 · 649 阅读 · 0 评论 -
备忘录模式(二十)
一、定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。二、角色Originator 发起人角色记录当前时刻的状态,负责定义哪些属于需要备份的状态,负责创建和恢复备忘录数据。Memento 备忘录角色负责存储发起人的状态Caretaker 备忘录管理员角色对备忘录进行管理和保存三、使用场景需要保存和恢复数据的相关状态场景...原创 2018-06-18 19:47:44 · 1140 阅读 · 0 评论 -
访问者模式(二十一)
一、定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。二、类图及角色1. Visitor 抽象访问者 抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是 visit 方法的参数定义哪些对象是可以被访问的。public interface IVisitor { // 可以访问哪些对象 public vo...原创 2018-06-19 20:05:19 · 507 阅读 · 0 评论 -
状态模式(二十二)
一、定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 怎么理解这句话呢,就比方水有不同的状态,气体、液体和固体,不同的状态拥有的行为和特征也不一致,例如水可以用来洗衣服,冰可以冷藏东西,水蒸气有遇冷会液化的行为,它们还是同一个对象,但是在不同的状态看起来像改变了其类。二、角色1. State 抽象状态角色 接口或抽象类,负责对象状态定义,并且封装环境角色...原创 2018-06-21 21:43:17 · 478 阅读 · 0 评论 -
解释器模式(二十三)
一、定义 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案,例如解析四则运算、SQL语句等,现在项目中使用较少,其定义如下: 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。二、类图和角色1. AbstractExpression 抽象解释器 具体解释任务由具体实现类完成。public abstra...原创 2018-06-22 09:19:51 · 581 阅读 · 0 评论 -
享元模式(二十四)
一、定义 享元模式(FlyweightPattern)是池技术的重要实现方式,其定义如下: 使用共享对象可有效地支持大量的细粒度的对象。 Flyweight 是拳击比赛中的特用名词,意思是“特轻量级”。用到设计模式中是指我们的类要轻量级,粒度要小。享元模式的定义为我们提出了两个要求:细粒度的对象和共享对象。我们知道分配太多的对象到应用程序中将有损程序的性能,同时还容易造成内存溢出...原创 2018-06-22 21:11:32 · 597 阅读 · 0 评论 -
桥梁模式(二十五)
一、定义 桥梁模式(BridgePattern)也叫做桥接模式,是一个比较简单的模式,其定义如下: 将抽象和实现解耦,使得两者可以独立地变化。二、类图及角色 桥梁模式是一个非常简单的模式,它只是使用了类间的聚合关系、继承、覆写等常用功能,但是它却提供了一个非常清晰、稳定的架构。1. Abstraction 抽象化角色 它的主要职责是定义出该角色的行为,同时保存一个对实现化角...原创 2018-06-23 10:53:31 · 626 阅读 · 0 评论 -
规则模式(二十六)
一、定义 规格模式(SpecificationPattern)可以认为是组合模式的一种扩展。 通常在查询、过滤等场景中,可以制定一些条件规则,这些规格也可以以 与、或、非 进行组合,从而灵活地对业务逻辑进行定制。二、场景分析 假设有一个用户类,同时还需要提供一个操作用户的辅助类,做一些查询工作。1. User 类public class User { private ...原创 2018-06-23 17:20:37 · 2011 阅读 · 0 评论 -
对象池模式(二十七)
一、定义 对象池模式,或者称为对象池服务,其意图如下: 通过循环使用对象,减少资源在初始化和释放时的昂贵损耗。 简单地说,就是用的时候从池中取,不用的时候放回池中,等待下一次需要用到的时候再取出去。典型的应用就是 连接池 和 线程池。二、类图 其中 checkOut() 负责从池中取出对象,checkIn() 负责回收对象(很多时候回收已经自动处理,不需要显性声明,如连接池...原创 2018-06-25 17:05:06 · 922 阅读 · 0 评论 -
雇工模式(二十八)
一、定义 雇工模式也叫做仆人模式(ServantDesignPattern),是行为模式的一种,其意图是: 为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展。二、类图1. IServiced 被服务者 定义“一组类”所具有的通用功能。public interface IServiced { // 具有的特质或功能 public void se...原创 2018-06-27 21:15:19 · 794 阅读 · 0 评论 -
黑板模式(二十九)
一、定义 黑板模式(BlackboardDesignPattern)是观察者模式的一个扩展,知名度并不高,但是我们使用的范围却非常广。黑板模式的意图如下: 允许消息的读写同时进行,广泛地交互消息。 简单地说,黑板模式允许多个消息读写者同时存在,消息的生产者和消费者完全分开。这就像一个黑板,任何一个教授(消息的生产者)都可以在其上书写消息,任何一个学生(消息的消费者)都可以从黑板上...原创 2018-06-28 08:24:48 · 2330 阅读 · 0 评论 -
空对象模式(三十)
一、定义 空对象模式(NullObjectPattern)是通过实现一个默认的无意义对象来避免 null 值出现。 简单地说,就是为了避免在程序中出现 null 值判断而诞生的一种常用设计方法。二、实例 我们直接通过一个例子来看看空对象模式是怎么回事吧。1. 模拟一个动物叫声的程序// 定义动物接口public interface Animal { public voi...原创 2018-06-28 09:49:04 · 673 阅读 · 0 评论