![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
文章平均质量分 93
设计模式相关技术文章
每天都要进步一点点
工作日常技术学习、积累、总结
展开
-
软件设计原则(七) 迪米特法则
一、迪米特法则的定义迪米特法则,也称为最少知识原则,虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,被耦合或调用的类的内部是如何复杂都和我没关系,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。二、迪米特法则的含义迪米特法则对类的低耦合提出了明确的规定,其包含以下几层含义。(一)、只和朋友交流迪米特法则,要求只与直接朋友通信。什么叫直接朋友?每个对象都必然会与其他对象有耦合关系,两原创 2021-10-12 21:12:00 · 435 阅读 · 0 评论 -
设计模式 (二十二) 责任链模式
一、概念概念:职责链模式,又叫责任链模式,指的是多个请求接收者串成一条链式结构,一个请求到达请求链上,如果该接收者不能处理请求则会将请求继续往下传递(通常每个接收者都包含对另一个接收者的引用),以此类推,直到找到有一个请求接收者能够处理该请求。职责链模式将请求发送者和请求接收者进行了解耦,此种模式属于行为型模式。 职责链模式常用场景有: Java中异常的处理,层层抛出; 拦截器链的...原创 2019-11-30 15:31:22 · 442 阅读 · 0 评论 -
设计模式 (二十一) 策略模式
一、概念概念:策略模式,指的是定义一系列的算法,将他们一个一个封装起来,然后在运行期间可以动态改变类执行的算法(动态改变类的行为)。策略模式属于行为型模式。(封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法)。在日常生活中有挺多策略模式的例子,如旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略;又比如我们设计一个排序算法,可能有很多种实现方...原创 2019-11-30 15:08:02 · 440 阅读 · 0 评论 -
设计模式 ( 二十) 备忘录模式
一、概念概念:备忘录模式,又叫做快照模式,指的就是提供一种方式,对原始对象的状态信息进行备份,保存对象某个时间的状态,以便于后期可以恢复到原先的状态。备忘录模式属于行为型模式。其实有很多备忘录模式的例子,像我们平常使用的开发工具如Ctrl + Z就提供了一种撤销的功能、我们通常的事务回滚等都是备忘录模式的范例。 通用类图:角色分析: Original: 原始对象,即需要被备...原创 2019-11-30 14:46:39 · 232 阅读 · 0 评论 -
设计模式 ( 十九) 中介者模式
一、概念概念:中介者模式,其实就是定义了一个具体中介者对象来协调各个子系统的交互依赖关系,使得各个子系统之间不会显式地发生依赖关系,从而降低了耦合性。中介者模式也是属于行为型模式。 生活中有挺多中介者模式的示例,比如我们使用的QQ聊天室和短信平台等等,QQ服务器和短信平台其实就是充当了一个中介者角色,通过这个平台我们就可以与其他QQ用户进行聊天或者发短信,并不需要依赖其他用户。还有就是...原创 2019-11-30 09:27:45 · 280 阅读 · 0 评论 -
设计模式 (十八 ) 观察者模式
一、概念概念:观察者模式,就是当一个对象的状态发生变化时,能自动通知其他依赖其的对象,并且更新他们的状态。观察者模式属于行为型模式。通过观察者模式,使得某个对象与其他依赖它的对象保持状态同步。(观察者订阅被观察者的状态,当被观察者状态改变的时候会通知所有订阅的观察者的过程) 大体UML类图:角色分析: Subject:抽象被观察者角色,也叫被订阅对象,通常是接口或者抽象类。当需要被观...原创 2019-11-30 09:08:24 · 722 阅读 · 0 评论 -
设计模式 (十七) 迭代器模式
一、概念概念:迭代器模式,又叫做游标模式,指的是提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节,迭代器模式属于行为型模式。 通用UML类图:角色分析: 抽象迭代器角色(Iterator):通常情况下定义了访问和遍历元素的接口; 具体迭代器角色(ConcreteIterator):需要实现抽象迭代器接口并且实现其中的抽象方法, 实现对聚合对象的遍历并要记录遍历...原创 2019-11-30 08:50:33 · 378 阅读 · 0 评论 -
设计模式 (十六) 命令模式
一、概念概念:命令模式,指的是将请求以命令的形式封装成一个对象,传给调用对象,然后调用对象去找能处理该命令的接收者,然后由命令接收者真正去执行命令。命令模式属于行为型模式。上面这句话理解起来相对比较抽象,百度百科有个比较好理解的例子:电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽...原创 2019-11-28 21:17:12 · 260 阅读 · 0 评论 -
设计模式 ( 十五 ) 模板方法模式
一、概念概念:模板方法模式,又叫模板模式,在抽象类中定义一个执行方法的模板,子类可以根据需要重写其中的方法,简单理解就是为其他子类提供一个算法框架。模板方法模式属于行为型模式,是借助于继承来实现的。 通用UML类图:角色分析:抽象模板(Abstract Template)角色:定义了模板方法以及整个实现的大体步骤,具体的子类需要实现其中的抽象方法;(抽象基类定义算法框架) 模...原创 2019-11-28 20:54:16 · 239 阅读 · 0 评论 -
设计模式 (十四) Cglib动态代理模式
一、概念概念:Cglib动态代理,其实就是被代理的对象可能不是一个接口,而仅仅是一个单独的对象,这样可以使用被代理对象的子类来实现代理的方式。Cglib是在内存中构建一个被代理对象的子类实现对被代理对象功能的扩展。 底层实现原理:利用字节码处理框架ASM转换字节码并生成新的类。二、示例示例:同样还是使用前面的租房子案例使用Cglib实现动态代理。【a】UML类图详细代理如下...原创 2019-11-27 21:33:57 · 299 阅读 · 0 评论 -
设计模式 ( 十三 ) JDK动态代理模式
一、概念动态代理模式:根据代理的对象,动态创建代理类,可以有效避免静态代理中代理类接口过多的问题。 实现方式:代理对象不需要再实现抽象接口了,但是被代理对象还是需要实现抽象接口;利用JDK中反射包下面的Proxy.newProxyInstance()方法动态地在内存中创建代理对象:/** * public static Object newProxyInstance(C...原创 2019-11-27 21:11:01 · 247 阅读 · 0 评论 -
设计模式 ( 十二 ) 静态代理模式
一、简介概念: 代理模式:为对象提供一个替身或者代理,控制对该对象的访问。即通过代理对象去访问目标对象,这样可以动态扩展目标对象的功能。 代理模式有三种模式: 静态代理 动态代理(JDK代理/接口代理) Cglib代理 通用类图:即客户端通过代理对象去访问目标对象,而不是直接访问目标对象,可以控制目标对象的访问。本文先讲解一下静态代理模式的实现方法。二、静...原创 2019-11-26 21:01:40 · 244 阅读 · 0 评论 -
设计模式 (十一) 外观模式
一、简介概念:外观模式,也叫过程模式,外观模式为各个子系统或者子对象提供了一致的高层接口,通过定义一个高层接口,用以屏蔽内部子系统的实现细节,使得客户端不直接与各个子系统进行关联,而是直接调用高层接口提供的方法。外观模式也属于结构性模式。 传统方式原理图:客户端直接依赖各个子系统,这样子系统发生一点变化,客户端就要改,不符合开闭原则。可见,客户端直接调用各个子系统的接口。外...原创 2019-11-17 09:37:37 · 400 阅读 · 0 评论 -
设计模式 (十) 装饰者模式
一、简介概念:装饰者模式,就是动态地扩展对象的功能,是继承的一个替代。如果不用装饰者模式,我们想要扩展一个对象的功能,可以通过继承该对象,然后重写里面的的方法来实现扩展原有功能,但是当对象变化频繁的时候,这种子类会有很多,装饰者模式有效避免了这种大量创建子类的现象,动态地扩展对象的功能。就增加功能来说,装饰者模式相比使用继承生成大量子类方式更为灵活。 装饰者模式大体UML类图:二、角...原创 2019-11-17 09:16:58 · 465 阅读 · 0 评论 -
设计模式 (九) 组合模式
一、简介概念:组合模式,又叫部分 - 整体模式,组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象。组合模式使得客户端不需要区分哪些是叶子,哪些是容器节点,都统一处理,极大地方便方法调用。组合模式属于结构性模式。 大体类图如下:组合模式相关角色说明:【a】component:抽象构建,可以是抽象类,也可以是接口,包含所有子类共有的行...原创 2019-11-13 21:12:57 · 312 阅读 · 0 评论 -
设计模式(八)桥接模式
一、简介概念:将抽象部分与它的实现部分分离开来,使他们可以在多个维度独立变化。桥接模式将继承关系转换为关联关系(组合或者聚合)来实现,符合合成复用原则。这样有利于降低类之间的耦合度,同时也减少了类的数量,方便后期扩展维护。举个例子: 模拟画图。现有一个需求:需要绘制大中小型号的图形,图形分长方形、正方形、圆形等等,图像分大、中、小等型号,这里有两个维度(大小、图形类型)都会进行变化,...原创 2019-11-09 21:19:52 · 309 阅读 · 0 评论 -
设计模式 (七) 适配器模式
一、简介概念:适配器模式,将某个类的接口转换成客户端期望的另一个接口表示,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,主要目的就是为了兼容,适配器模式属于结构型模式。主要分为三种模式: 类适配器模式; 对象适配器模式; 接口适配器模式;工作原理示意图:适配器模式涉及角色: 目标(Target):客户端所期待得到的接口; 适配器(Adaper)角色:适...原创 2019-11-09 20:57:00 · 501 阅读 · 0 评论 -
设计模式 ( 六 ) 建造者模式
一、简介概念:建造者模式,也属于创建型模式,就是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单理解就是说:建造者模式、可以将部件和其组装过程分开,一步一步创建一个复杂的对象。它隐藏了复杂对象的创建过程,它按照一定的顺序创建复杂对象,用户只需要给出复杂对象的类型即可获取对应的实例对象,即在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。举个...原创 2019-11-05 21:07:59 · 351 阅读 · 0 评论 -
设计模式 (五) 原型模式
一、简介概念: 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象,原型模式属于创建型模式,它提供了一种创建对象的最佳方式。形象比喻:细胞复制分裂,下面是网上找的细胞分裂图由图可见,复制新细胞的行为也是细胞自身发起,其实就是说原型对象自己不仅是个对象还是个工厂。原型模式,通过克隆方式创建的对象是全新的对象,它们都是有自己的新的地址,hashcode不同, 复...原创 2019-11-03 11:24:38 · 286 阅读 · 0 评论 -
设计模式 ( 四 ) 抽象工厂模式
一、简介概念:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。上面的文字说明,并不是很好理解,所以举个简单的例子:如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。我们将生产海尔电视机、海尔电冰箱(位于不同等级结构中的产品)的工厂就叫做抽象工厂。二、与工厂方...原创 2019-10-24 20:58:39 · 412 阅读 · 0 评论 -
设计模式 ( 三 ) 工厂方法模式
一、简介概念:定义了一个创建对象的抽象方法,由子类决定要实例化的类,将对象实例化推迟到子类进行。按照前面讲解的简单工厂模式,假如随着需求不断变化,系统需要优化,想将宝马汽车、奔驰汽车等不同品牌的汽车分开生产,可能后面会扩展不同品牌不同厂家这种情况。针对这种情况,我们可以使用工厂方法模式创建不同品牌汽车的工厂,这样的话,他们之间互不影响。后面如果想扩展其他品牌的话,也无需改动旧代码,直接添加多...原创 2019-10-24 14:28:52 · 367 阅读 · 0 评论 -
设计模式 ( 二 ) 简单工厂模式
一、简介工厂模式是工作中比较常用的一种模式,分为简单工厂模式、工厂方法模式,抽象工厂模式,接下来我们将首先介绍简单工厂模式的思想以及通过一个简答的示例说明其好处。概念:简单工厂模式属于创建型模式,是工厂模式的一种,也叫静态工厂模式(Static Factory Method)。简单工厂模式是由一个工厂对象决定创建出哪一种类型的产品,定义一个统一的创建对象的类,由这个类负责实例化对象的行为...原创 2019-10-20 21:10:18 · 268 阅读 · 2 评论 -
设计模式 ( 一 ) 单例模式
一、概念所谓单例模式,就是采取一定的方法保证整个系统中,对某个类只能存在一个对象实例,并且该类只对外提供一个获取该对象实例的方法。分类:单例模式一共有八种写法,分别为:饿汉式 - 静态常量方式; 饿汉式 - 静态代码块; 懒汉式 - 线程不安全方式; 懒汉式 - 线程安全 - 同步方法方式; 懒汉式 - 线程安全 - 同步代码块; 双重检查(Double Check); 静...原创 2019-10-19 10:25:11 · 218 阅读 · 0 评论 -
软件设计原则(六) 合成复用原则
一、简介(一)概念合成复用原则,又叫组合/聚合复用原则,它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。(二)继承复用通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点:继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。 子类与父...原创 2019-10-15 20:38:45 · 565 阅读 · 0 评论 -
软件设计原则(五) 开闭原则
一、简介概念:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。问题由来:直接在原代码上修改会有风险,可能导致原先功能出现不可预知错误; 如果新需求更改频繁,对原先功能就修改越频繁; 随着功能的增多,模块的大小也越来越臃肿;实现方式:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。(用抽象构建框架,用...原创 2019-10-12 21:46:48 · 580 阅读 · 0 评论 -
软件设计原则(四) 里氏替换原则
一、概念里氏替换原则,在设计模式之禅一书中有两种定义:定义1:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2 时,程序P的行为没有发生变化,那么类型 S 是类型 T 的子类型。 定义2:所有引用基类的地方必须能透明地使用其子类的对象。综合上面比较抽象的含义,换句话可能好理解些:其实就是对于同一个程序P,把出现父类对象的地方...原创 2019-10-11 21:29:14 · 575 阅读 · 0 评论 -
软件设计原则(三) 依赖倒置原则
一、概念高层模块不能依赖低层模块,两者都应该依赖抽象(抽象类或者接口); 抽象不能依赖细节,细节应该依赖抽象; 依赖倒置原则核心思想就是面向抽象类或者接口(abstract class / interface)编程; 程序要依赖于抽象接口,不要依赖于具体实现;优点:降低了客户与实现模块间的耦合; 提高代码的可读性、可扩展性和可维护性; 提高系统的稳定性,降低并行开发引起的风险;...原创 2019-10-10 21:01:21 · 254 阅读 · 0 评论 -
软件设计原则(二) 接口隔离原则
一、概念客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖应该建立在最小的接口上。简单理解,就是不要在一个接口中定义太多的方法,这样这个接口会显得非常臃肿。接口应该细分到对应一个功能模块,不能建立一个大的接口将很多客户端要用的方法都写在一个接口中。与单一职责原则区别:接口隔离原则和单一职责原则的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划...原创 2019-10-08 22:26:00 · 470 阅读 · 0 评论 -
软件设计原则(一) 单一职责原则
一、简介最近看了一些帖子,有句话特别深刻:"技术人,写代码其实大家都会,就看谁写的代码好理解,好扩展,好维护"。接下来一段时间,想去研究研究设计模式,去领悟一下其中的奥妙。在学习设计模式之前,先研究一波软件设计的七大原则:单一职责原则 接口隔离原则 依赖倒置原则 里氏替换原则 开闭原则 迪米特原则 合成复用原则本文将首先总结一下单一职责原则。二、概念对类而言,一个类/...原创 2019-10-08 22:13:39 · 673 阅读 · 0 评论