设计模式
文章平均质量分 54
写给杭州的歌
开此博客来记录和监督android的学习
展开
-
六大设计原则,开闭原则
开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 这句话的意思是说,一个软件实体应该通过扩展来实现变化,而不是通过写该已有的代码来实现变化。同样的,我们在现实开发中,最乐意做的事情就是扩展一个类,而不是修改一个类,不管原有的代码写的多么优秀还是多么糟糕,让开发读懂原有的代码,而后再修改是一件非常痛苦的事情。我们来看这样一个例子,T先生开了一家书店,专门卖小说类的书籍,然后他原创 2016-12-03 20:35:17 · 460 阅读 · 0 评论 -
原型模式
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。我们知道产生一个对象,我们可以通过new关键字,但如果我们是通过对象复制来实现的产生一个对象,那么,这种模式叫做原型模式。 先来看一下原型模式的通用代码。public class PrototypeClass implements Cloneable { //覆写父类的Object方法 @Override原创 2016-12-21 13:35:04 · 356 阅读 · 0 评论 -
中介者模式
定义:用一个中介对象封装一系列的对象交互,中介者使各个对象不惜要显示地相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。我们在实际开发中可能会遇到这样的网状的类间耦合关系,如图。 我们把各个节点想成各个类,连线,表示其耦合关系。那中介这模式其实借鉴了计算机网络中的路由结构,他就将上图关系转化成了,如图 中间这个节点,就是中介者,从图中可以看出他减少了类间的耦原创 2016-12-28 14:08:47 · 342 阅读 · 0 评论 -
命令模式
定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。我们先来看一下命令模式的一般类图 在该类图中,我们可以看到三个角色, 1. Receiver接受者角色,该角色就是落实到最后代码实际执行了部分 2. Command命令角色,这是命令模式的核心类,我们通过扩展该类来实现多个命令的解耦。把请求方(Invoker)原创 2017-01-01 20:02:59 · 405 阅读 · 0 评论 -
责任链模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理他为止。我们先来看一下类图 可以看到我们定义了一个操作接口(Handler),多个有机会处理同一个请求的操作去扩展这个操作接口,有点绕,我们来联系到现实生活中的一个例子就好理解了。比如我们要向公司请求一个福利,那我们可能会去和我们的项目经理说,然后项目经理原创 2017-01-02 22:16:04 · 377 阅读 · 0 评论 -
装饰模式
定义:动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 我们先来看一下装饰模式的类图吧 这里有几个角色说明一下1 . Component抽象组件 Component是一个接口或者抽象类,就是定义我们最核心的对象,也就是原始对象 2 . ConcreteComponent具体组件 ConcreteComponent是最核心、最原始原创 2017-01-04 15:22:51 · 317 阅读 · 0 评论 -
策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以相互换。我们先来看一看他的类图 这里有三个角色我们一一来解释一下 1. Context 封装角色:它叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 2. Strategy抽象策略角色:策略、算法家族的抽象,通常为借口,定义每个策略或算法必须具有的方法和属性。 3. Concre原创 2017-01-14 23:19:24 · 319 阅读 · 0 评论 -
适配器模式
定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。同样的我们先来看一个类图 这里主要涉及到三个角色: 1 . Target目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口。 2 . Adaptee源角色:就是被适配的那个接口 3 . Adapter适配器角色:适配器模式中的核心角色,其他两个角色都原创 2017-01-17 16:54:13 · 372 阅读 · 0 评论 -
门面模式
门面模式(Facade Pattern)定义:Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通讯必须通过一个统一的对象进行。原创 2017-03-18 21:02:12 · 458 阅读 · 0 评论 -
组合模式(树状结构)
定义:将对象组合成树型结构以表示”部分-整体”的层次结构,是的用户对单个对象的使用具有一致性.我们先来看看组合模式的通用类图 几个角色介绍下: 1. Component抽象构建角色, 定义参加组合对象的公共方法和属性,可以定义一些默认的行为或熟悉, 2. Leaf叶子构件2, 叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. 3. ComPosite树枝构件, 它的作用是组原创 2017-03-15 19:34:39 · 620 阅读 · 0 评论 -
代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。 代理模式也叫作委托模式,它频繁出现在我们的程序设计中。一般可分为两类,一类是静态代理,一类是动态代理。本篇文章只讲动态代理。 面向横切面编程(AOP),的核心就是采用动态代理机制。 这里出现了一个名词,什么是面向横切面?笔者Google了一下,大胆地下了一个结论,笔者认为,就是所谓的,对一个类中的既定方法,在运行过程中进行一定的补充。原创 2016-12-12 23:13:09 · 298 阅读 · 0 评论 -
建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建可以创建不同的表示。我们需要理解的是,建造者模式就是模板方法的升级版.在建造者模式中有如下4个角色。 1. Product产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法。 2. Builder抽象建造者,规范产品的组件,一般由子类实现。 3. ConcreteBuilder具体建造者,实现抽象定义的所有方法,并且返回一原创 2016-12-11 18:28:27 · 340 阅读 · 0 评论 -
六大设计原则,迪米特法则
“任何两个素不相识的人中间最多只隔着6个人,即只通过六个人就可以将他们联系在一起”,这就是著名的“六度分隔理论”。但是这个理论用在程序设计中,就不行了,如果一个类跳到另一个类,需要跳两次以上,那么我们就要考虑考虑想办法重构代码了。其实迪米特法则的核心观念就是类间解耦,弱耦合。迪米特法则也称最少知识原则。他对类的低耦合,提了四层含义。 1.一个类只与直接的朋友通信。那么,什么叫做一个类的朋友呢?出原创 2016-12-02 21:12:24 · 367 阅读 · 0 评论 -
六大设计原则,接口隔离原则
接口隔离原则定义: 1.客户端不应该依赖他不需要的接口 2.雷剑的依赖关系应该建立在最小的接口上看这个这定义兼职绕口,我们先来回想一下单一职责原则这个原则讲的是一个接口在业务逻辑上,只能有一个职责。而接口隔离原则说的是要建立单一接口,接口尽量细化,接口中的方法尽量少。看起来这两个原则很像,下面我们来举个例子解释一下他们之间的差别。假设,我们要写一个美女的接口。那接口中会有这几个方法,描述长相的,原创 2016-12-01 13:22:27 · 380 阅读 · 0 评论 -
六大设计原则,依赖倒置原则
依赖倒置原则的定义百度搜一下,很绕口,在Java中的表现就是:1.模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。 2.接口或抽象类不依赖于实现类。 3.实现类依赖接口或抽象类。它的本质用六个字概括就是“面向接口编程”。我们先来看一下如果我们不是面向接口编程,我们会面临什么样子的窘境。T先生最近写了一款软件赚了一大笔钱,于是他买了一辆宝马(BMW),原创 2016-11-30 14:44:08 · 433 阅读 · 0 评论 -
六大设计原则,里氏替换原则
我们都知道继承是面向对象语言中极其重要的一部分语法,当然他的存在给了我们很大的便利,但是同样他也有很多的缺陷。 继承是侵入性的,只要继承,就必须拥有父类的所有属性和方法; 降低了代码的灵活性。子类必须拥有父类的属性和方法,上子类多了很多的约束; 增强了耦合性。当父类的常量,变量,方法,被修改是,需要考虑子类的修改; 那么,里氏替换原则就是主要对继承做了一些规范。我们先来看一下里氏替换原则的定义:原创 2016-11-29 16:58:55 · 1200 阅读 · 0 评论 -
六大设计原则,单一职责原则
我在差不多半年前读过这样一本书,《Head First 设计模式》,当时就被设计模式这四个字吸引了,曾经一度让我有了初恋般的感觉。但是没想着,做点记录,现在挺后悔的,所以差不多把设计思想又还给作者。这次重拾设计模式,就要开始做记录啦,写的不好的地方,多多包涵。献上一句我做喜欢的话,“三十年河东,三十年河西,莫欺少年穷”。在六大设计原则里面,单一职责原则是最引人们争议的,下面我们就围绕这几个问题来进行原创 2016-11-28 22:38:39 · 602 阅读 · 0 评论 -
单例模式
单例模式定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。使用场景: 1. 要求生成唯一序列号的环境; 2. 在整个项目种需要一个共享访问点或共享数据; 3. 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; 4. 需要定义大量的静态变量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。创建单例一般分为三步:原创 2016-12-04 18:47:15 · 320 阅读 · 0 评论 -
工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。这是标准工厂方法的类图。 下面我们来列举一个比较实用的通用模板。抽象产品类public abstract class Product { //产品类的公共方法 public void method1(){ //业务逻辑处理 } //抽象方法 p原创 2016-12-05 13:39:30 · 305 阅读 · 0 评论 -
抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 这是抽象工厂模式的官方定义。但是我觉得,抽象工厂模式就是工厂方法的升级版本。所以要了解抽象工厂模式首先得要熟悉工厂方法,抽象工厂方法其实对工厂方法的产品类进行了扩充,现在来看一张图。 这张图是什么意思呢?举个例子,我们把1想成QQ,2想成WPS,A想成Linux,B想成Windows。OK,那为什么要这样想原创 2016-12-06 18:59:30 · 394 阅读 · 0 评论 -
模板方法模式
定义:用来定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。在一个软件开发的过程中,如果相同的一段代码,复制过两次,就需要对设计产生怀疑。面向对象要求我们,用抽象来解决子类共性的封装。模板方法,有两种方法,一种是基本方法,另一种是模板方法。下面来看一个基本模板。抽象模板类 public abstract class Abstract原创 2016-12-08 13:21:37 · 290 阅读 · 0 评论 -
观察者模式
定义:定义对象间一种一对多的依赖关系,是的每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新. 我们先来解释一下观察者模式的几个角色名称: Subject被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察这必须实现的职责:管理观察者并通知观察者。 Observer观察者:观察者接收到消息后,机进行update(更原创 2017-03-16 19:37:03 · 329 阅读 · 0 评论