设计模式那点事
文章平均质量分 60
Crazy丶Mark
这个作者很懒,什么都没留下…
展开
-
代理模式
代理模式是一个非常常见的模式,他有非常多的变种。比如说远程代理,他可以让操作远程对象像操作本地对象一样的容易还有虚拟代理,他主要是代理一些加载特别缓慢的对象,先展示给用户的是一个代理对象,然后异步加载真正的对象,来提高系统的响应速度代理模式的变种是在是太多了,今天我主要给大家介绍的是保护代理,我分别用静态代理和动态代理两种方式去实现保护代理我们都知道,对于系统的升级最好要对原先的代...原创 2018-03-07 13:44:42 · 174 阅读 · 0 评论 -
装饰者模式
在谈装饰这模式之前,我想让大家思考一下,我们开发的时候为什么要遵守开闭原则(对拓展开放,对修改关闭)?这看起来是一个非常矛盾的事情,又要拓展功能,又不能够修改已有的代码。其实,这样做最主要的原因是防止因为修改已有代码引入新的BUG,已有的代码一般都是经过检测的,很少有BUG,如果直接在上面修改的话,很可能导致未知的错误,可能引起别的组件的故障,甚至瘫痪整个系统。在明白上述这一点之后,我们就比较...原创 2018-02-25 13:48:14 · 309 阅读 · 0 评论 -
观察者模式
和以前一样,在介绍观察者模式之前,我们先看看如果不用观察者模式会是怎样的首先我们假定以下情景:有一个数据源DataSource,要分别在三个地方Place1,Place2,Place3这三个地方展示,我们来看看传统的硬编码会怎么做?(因为比较容易,直接给类图,就不上代码了) 这里定义了Datasource,他是这样工作的:调用setData改变数据调用updata,其实是调用里面...原创 2018-02-24 15:56:44 · 167 阅读 · 0 评论 -
模板模式
模板模式的核心是定义一个算法的骨架,把一些可能变化的实现延迟到子类中去。工厂方法可以看成是一种特殊的模板模式。模板模式还与策略模式有点相似,但是他们的侧重点不同,模板模式的侧重点是规定算法模板,让别人按照他的意图去做事,策略模式的侧重点是定义一系列的方法簇,让使用者自己去选择。他们一个占据着主导权,一个交出了主导权下面我们通过一个榨汁机的例子来看看模板模式是如何实现的public ab...原创 2018-03-04 10:41:55 · 232 阅读 · 0 评论 -
外观模式
外观模式的核心是把复杂的调用关系封装起来,提供简单的接口我们拿电脑举例,电脑的启动是复杂的,要启动CPU,显示器,风扇等等,假如没有外观模式,需要我们手动的去启动各个组件,这实在是太可怕了。当我们用了外观模式,把这些操作全部封装在一个方法里面,那么我们启动电脑就轻松愉快了,下面我们来看看代码public class AirFan { public void AirFanSt...原创 2018-03-03 11:19:19 · 212 阅读 · 0 评论 -
适配器模式
我们经常会遇到这样的场景:别人提供的接口和我们需要的接口不兼容的情况,这个时候我们就需要用到适配器了,把别人的接口转化成我们需要的接口。我们看看是如何做到的先看看类图: 我们有三孔和两孔两种接口,三孔适配器的作用是把三孔适配为两孔,我们来看看代码public interface ThreeHole { void provideThreeHole();}publ...原创 2018-03-03 11:05:33 · 212 阅读 · 0 评论 -
策略模式
我们在讲策略模式之前,先看看为什么要使用策略模式,用策略模式有什么好处假定,我们面对着以下的需求:我们需要管理很多种类的汽车,需要用程序去描述他们很自然的,我们会想到使用继承来复用代码,关系继承关系如下:汽车能够跑,能够发出声音,roadster和bicycle通过继承Car,可以实现代码的复用但是随着管理的车渐渐变多,我们发现,有的车有不同的行为方式,有不同的声音,甚至还有不...原创 2018-02-23 14:29:51 · 306 阅读 · 0 评论 -
命令模式
今天我来讲一下命令模式,命令模式的运用,以及命令模式的优势和不足。我先用例子说明什么是命令模式假设以下场景:有一个控制门和灯的遥控,我们要用遥控来控制他们的行为,并且要实现命令的撤销。 看看类图: 所有的命令类都实现Command接口,有执行和撤销两个操作 Invoker是命令的调用者 Door 和 Light是具体的命令执行者下面我们来看看代码:public cl...原创 2018-03-02 12:22:03 · 216 阅读 · 0 评论 -
线程安全的登记式单例
有的时候,我们不希望在一开始的时候就把一个类写成单例模式,但是在运用的时候,我们却可以像单例一样使用他最典型的例子就是spring,他的默认类型就是单例,spring是如何做到把不是单例的类变成单例呢?这就用到了登记式单例其实登记式单例并没有去改变类,他所做的就是起到一个登记的作用,如果没有登记,他就给你登记,并把生成的实例保存起来,下次你要用的时候直接给你。IOC容器就是做的这个...原创 2018-03-08 10:41:28 · 1270 阅读 · 1 评论 -
单例模式
在设计架构的时候,我们经常会遇到有一些组件,我们希望整个项目中,它只有一个存在,比如说全局的配置文件、维护映射关系的列表、一些共享的容器等等,这个时候我们就要用到单例模式,不然的话,你能想象出一个程序加载多个全局配置文件的美妙画面的。我主要介绍三种常用的线程安全的单例模式,单例模式没有别的模式复杂的类关系,代码也很简单,但是要完全弄懂它真的不容易,下面我通过下面三种实现方式,给大家剖析一下他们...原创 2018-02-28 13:58:42 · 167 阅读 · 1 评论 -
抽象工厂
如果没有看简单工厂和工厂方法的建议先看一下,因为我使用的是一个例子来进行演进讲解的!传送门ok,下面进入正题。前面我们已经开了连锁店,并且随着规模的越来越大,市场反映越来越好,伴随而来的麻烦事也变多了,比如说客户的需求越来越多,我们的产品需要变得更加的多元化,慢慢的发现,使用现有的系统来管理越来越力不从心。于是,对于系统的升级势在必行我们决定采用抽象工厂来重构系统,我们来看看类图:...原创 2018-02-27 19:16:12 · 150 阅读 · 0 评论 -
简单工厂和工厂方法
当我们在实际开发的过程中,经常会用到new这个关键字,需要用到什么类,就new什么类,非常的方便,但是我们在享受这种便利的同时,这种便利也给我们带来了一些麻烦:使用new关键字之后,会让类之间的耦合度变高,比如说:Fruit fruit=new Apple(),这样就写死了,如果想把fruit修改成别的什么水果,就必须去改代码,这不符合我们的开闭原则(不了解的可以看这里)于是我们引入了简单...原创 2018-02-27 17:29:42 · 310 阅读 · 0 评论 -
状态模式
有时候,我们会遇见一些场景,里面有非常多的状态变化,各个状态下又有不同的行为,在这种情况下,如果用if-else去写程序的话,会让代码的可读性非常差,编写会非常容易出错,也不容易维护和拓展。在这种情况下,我们就要用到状态模式。我们拿女孩多变的心情来举例吧,下面看看状态的变化图 假设女孩的心情在这四种之间自由转化(天知道有几种- -),如果我们用if-else去做,估计复杂的关系会把人逼疯...原创 2018-03-05 14:04:26 · 201 阅读 · 0 评论