
设计模式和原则
文章平均质量分 85
红枫忆梦
书到用时方恨少
展开
-
原型模式(Prototype Pattern)
目录定义实现实现Cloneable接口重写Object类中的clone方法示例优点缺点深拷贝与浅拷贝浅拷贝深拷贝适用场景 定义通过复制现有的对象实例来创建新的对象实例。实现实现Cloneable接口Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的...原创 2018-08-31 09:20:19 · 186 阅读 · 0 评论 -
观察者模式(Observer Pattern)
定义定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型行为类模式类图在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;再比如,我们要设计一个自动部署的功能,就像eclip...原创 2018-09-10 08:40:01 · 319 阅读 · 0 评论 -
组合模式(Composite Pattern)
介绍组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕。组合模式可以优化处理递归或分级数据结构.有许多关于分级数据结构的例子,使得组合模式非常有用武之地。类图组成部分Component: 为参加组合的对象声明一个公共接口, 不管是组合还是叶结点.L...原创 2018-09-07 08:28:38 · 177 阅读 · 0 评论 -
责任链模式(Chain of Responsibility Pattern)
定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。类型行为类模式类图首先来看一段代码:public void test(int i,Request request) { if(i == 1) { Handler1.response(request);...转载 2018-09-18 08:56:51 · 184 阅读 · 0 评论 -
访问者模式(Visitor Pattern)
定义封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。类型行为类模式类图访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由。我们首先来看一个简单的例子,代码如下:class A { public void method1() { System.out.pri...转载 2018-09-13 09:08:51 · 128 阅读 · 0 评论 -
享元模式(Flyweight Pattern)
在阎宏博士的《JAVA与模式》一书中开头是这样描述享元(Flyweight)模式的:Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。Java中的String类型在JAVA语言中,String类型就是使用了享元模式。String对象是fi...转载 2018-09-23 21:10:07 · 234 阅读 · 0 评论 -
状态模式(State Pattern)
概述当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。状态模式是一种对象行为型模式。适用场景用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题。简单说就是处理对象的多种状态及其相互转换。UML类图参与者1>...原创 2018-09-25 08:51:09 · 201 阅读 · 0 评论 -
中介者模式(Mediator Pattern)
定义用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。类型行为类模式类图中介者模式的结构中介者模式又称为调停者模式,从类图中看,共分为3部分:抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。中介者实现类:从抽象中介...转载 2018-09-22 10:23:18 · 236 阅读 · 0 评论 -
单一职责原则
定义不要存在多于一个导致类变更的原因。 通俗的说,即一个类只负责一项职责。问题由来类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不...原创 2018-10-19 14:47:16 · 169 阅读 · 0 评论 -
里氏替换原则
里氏替换原则肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988 年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。定义 1如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2, 使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时, 程序 P 的行为没有发生变化,那么类型 T...原创 2019-03-06 20:53:42 · 400 阅读 · 0 评论 -
接口隔离原则
定义客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来类 A 通过接口 I 依赖类 B,类 C 通过接口 I 依赖类 D,如果接口 I 对于类 A 和类 B 来说不是最小接口,则类 B 和类 D 必须去实现他们 不需要的方法。解决方案将臃肿的接口 I 拆分为独立的几个接口,类 A 和类 C 分别与他们 需要的接口建立依赖关系。也就是采用接口隔离原则。 ...转载 2019-03-09 20:19:24 · 1912 阅读 · 0 评论 -
依赖倒置原则
定义高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。问题由来类 A 直接依赖类 B,假如要将类 A 改为依赖类 C,则必须通过修改类 A 的代码来达成。这种场景下,类 A 一般是高层模块,负责复杂的业务逻辑;类 B 和类 C 是低层模块,负责基本的原子操作;假如修改类 A,会给程序带来不必要的风险。解决方案将类 A 修改为依赖接口 I,类 B 和类...原创 2019-03-07 20:31:43 · 139 阅读 · 0 评论 -
开闭原则
定义一个软件实体如类、模块和函数应该对扩展开放、对修改关闭。问题由来在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。解决方案当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。开闭原则是面向对象的设计中最基础的设计原则,它指...转载 2019-05-05 15:38:21 · 117 阅读 · 0 评论 -
备忘录模式(Memento Pattern)
定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。类型行为类模式类图我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回。这时我们便可以...转载 2018-09-17 09:04:46 · 168 阅读 · 0 评论 -
命令模式(Command Pattern)
定义将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。类型行为类模式类图命令模式的结构顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构:Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。Concrete...转载 2018-09-16 08:28:49 · 473 阅读 · 0 评论 -
单例模式(Singleton Pattern)
目录定义特点单例模式的要点单例模式根据实例化对象时机的不同分为两种单例模式还有一种比较常见的形式:双重锁的形式单例模式的优点单例模式的缺点适用场景单例模式注意事项关于Java中单例模式的一些常见问题定义单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实...原创 2018-08-29 09:20:16 · 176 阅读 · 0 评论 -
代理模式(Proxy Pattern)
目录定义角色分类静态代理动态代理优点缺点定义为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。角色1、抽象角色:声明真实对象和代理对象的共同接口。2、代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相...原创 2018-09-04 08:53:59 · 111 阅读 · 0 评论 -
生成器模式(Builder Pattern)
目录定义四个要素示例优点缺点应用场景定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象。四个要素Builder:生成器接口,定义创建一个Product对象所需要的各个部件的操作。ConcreteBuilder:具体的生成器实现,实现各个...原创 2018-09-01 09:54:21 · 270 阅读 · 0 评论 -
工厂模式(Factory Pattern)
目录定义工厂模式根据抽象程度的不同分为三种简单工厂模式工厂方法模式抽象工厂模式工厂模式的优点工厂模式的缺点工厂模式的适用场景关于Java中的工厂模式的一些常见问题总结定义工厂模式是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体过程屏蔽隔离...原创 2018-08-30 09:26:06 · 251 阅读 · 0 评论 -
适配器模式(Adapter Pattern)
目录定义角色分类优点缺点适用场景小结定义将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。角色目标(Target)角色:这就是所期待得到的接口,也就是这类的接口是符合我们要求的。源(Adapee)角色:我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。适配器(A...原创 2018-09-02 09:57:51 · 139 阅读 · 0 评论 -
外观模式(Facade Pattern)
定义为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。角色1、外观(Facade)角色 :客户端可以调用这个角色的方法。此角色知晓相关子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。2、子系统(SubSystem)角色 :可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,...原创 2018-09-05 09:20:08 · 120 阅读 · 0 评论 -
策略模式(Strategy Pattern)
定义定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。类型行为类模式类图策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式。对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在...转载 2018-09-08 08:39:27 · 194 阅读 · 0 评论 -
迭代器模式(Iterator Pattern)
定义提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型行为类模式类图如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:public static void print(Collection coll) { Iterator it = coll.iterator();...转载 2018-09-11 15:44:00 · 132 阅读 · 0 评论 -
装饰者模式(Decorator Pattern)
目录定义角色示例优点缺点装饰者与适配者模式的区别装饰者和继承的区别继承装饰者适用场景定义在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。角色抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象。具体构件角色(Employee):定...原创 2018-09-03 10:09:15 · 117 阅读 · 0 评论 -
模板方法模式(Template Method Pattern)
定义定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。类型行为类模式类图事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有...转载 2018-09-09 08:27:04 · 718 阅读 · 0 评论 -
桥接模式(Bridge Pattern)
介绍桥接模式 (Bridge)将抽象部分与实现部分分离,使它们都可以独立的变化。桥接模式是一种结构式模式。结构代码实现Implementor : 定义实现接口。interface Implementor { //实现抽象部分需要的某些具体功能 public void operationImpl();} Abstraction : 定义抽象接口。...转载 2018-09-06 08:24:13 · 184 阅读 · 0 评论 -
解释器模式(Interpreter Pattern)
定义给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。类型行为类模式类图解释器模式的结构抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释...转载 2018-09-12 08:46:09 · 158 阅读 · 0 评论 -
迪米特法则
定义一个对象应该对其他对象保持最少的了解。问题由来类与类之间的关系越密切,耦合度越大,当一个类发生改变时, 对另一个类的影响也越大。解决方案尽量降低类与类之间的耦合。自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之 间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻, 但是怎么样编程才能做到低耦合呢?那正...转载 2019-04-30 14:48:28 · 675 阅读 · 0 评论