设计模式
陆多多
这个作者很懒,什么都没留下…
展开
-
解释器模式
前言: 解析器模式从名字看来就是解释一串表达式字符所抽象出来的一种设计模式,应用场景比较特定,之所以这个能变成一种设计模式,或许它提供了给我们一种通用的语法解析的方法。为什么要这么做: 当我们要实现对 x+y,x-y,x*y 这样一串文本表达式的解析时,我第一个想到的可能就是枚举不同的操作符,然后判断两边的值是否符合预期,符合就根据对操作符的枚举定义输出结果。解释器模式的实现: 包含5个角原创 2017-08-09 00:18:45 · 280 阅读 · 0 评论 -
观察者模式
定义观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。设计模式观察者模式很好的体现了开闭原则。subject作为一个容器,保存观察者接口对象的集合。对外提供新增,删除,和通知观察者的方法。功能封装,对修改关闭。...原创 2019-06-13 10:39:11 · 214 阅读 · 0 评论 -
备忘录模式
概况备忘录模式看起来比较简单,但实现方式却有很多方式,在实现中我们可以发现面向对象的很多特点:如抽象,面向接口编程,职责分离,这些才是我们需要了解的重点。备忘录启示宽窄接口(内部类的应用)我们知道内部类持有外部类的一个引用,此时外部类对内部类可见,我们可以利用这个特性实现接口的可见性。jdk源码应用在java.util.Date中,包含如下几个变量long fastTime...原创 2018-09-19 19:16:34 · 199 阅读 · 0 评论 -
建造者模式
与抽象工厂模式的区别是:建造者模式更加关注与零件装配的顺序。“遇到多个构造器参数时要考虑用构建器”,其实这里的构建器就属于建造者模式,只是里面把四个角色都放到具体产品里面了。而建造者模式主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。Bu...原创 2018-08-02 17:23:06 · 120 阅读 · 0 评论 -
代理模式
我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。动态代理是在程序运行时通过反射机制动态创建的。● 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用...原创 2018-07-30 20:50:49 · 188 阅读 · 0 评论 -
中介者模式
● Mediator 抽象中介者角色 抽象中介者角色定义统一的接口,用于各同事角色之间的通信。 ● Concrete Mediator 具体中介者角色 具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。 ● Colleague 同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分为两种:一种是同事...原创 2018-07-30 20:49:04 · 100 阅读 · 0 评论 -
原型模式
浅拷贝和深拷贝:浅拷贝:Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,其他的原始类型比如int、long、char、string(当做是原始类型)等都会被拷贝。 注意: 使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用对象,而...原创 2018-07-30 20:48:26 · 178 阅读 · 0 评论 -
模板方法模式
使用场景:● 多个子类有公有的方法,并且逻辑基本相同时。 ● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。 ● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。...原创 2018-07-30 20:47:36 · 114 阅读 · 0 评论 -
单例模式
懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。双重校验锁枚举public enum SingletonDemo6 { instance; public void whateverMethod(){ } }静态内部类...原创 2018-07-30 20:46:54 · 105 阅读 · 0 评论 -
工厂模式
属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。 也可以说是用于策略选择。不同的选择为产品。1.简单工厂模式一个产品接口。一个工厂类。在工厂类中通过if else选择不同的产品。2.工厂方法模式创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。3.抽象工厂模式对工厂方法进行扩展。各个工厂类中,再增加一个...原创 2018-07-30 20:45:25 · 132 阅读 · 0 评论 -
命令模式
解决那类问题解决命令发出者和接受者的耦合,所有的操作请求都可看作命令。所有的处理类都可看作接受者,当我们对请求排队,支持取消的时候,这个时候就可以使用命令模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请...原创 2018-07-02 12:46:12 · 207 阅读 · 0 评论 -
迭代子模式
前言: 主要应用在对聚集的遍历。为什么需要使用迭代子模式: 将集合的定义和对集合的遍历操作拆分开来,便于集合操作的扩展。 迭代子对象是对遍历的抽象化。遍历算法被封装在迭代子对象中,因此遍历算法可以独立与聚集对象而变化。类图: 白盒聚集与外禀迭代子 黑盒聚集与内禀迭代子 1.Aggregate 抽象聚集角色类:需要包含一个生成迭代子对象的方法。 2.ConcreteAggregate原创 2017-08-07 00:25:50 · 304 阅读 · 0 评论 -
模板模式
前言: 模板模式看起来不像一个设计模式,可能它看起来太简单了吧。把一些方法中的共性抽象到一个抽象类中,然后子类去实现这个抽象类中的方法就是模板模式。但这只是简单的说法,更准备的说法是这个抽象父类要控制流程,具体实现由子类控制,所以父类中一般有抽象待实现方法和一些具体的流程方法。为了防止子类篡改,具体方法一般是final方法。但为了应用更加灵活,我们一般会增加一个钩子方法,在子类中一般有一个字段,然原创 2017-08-06 00:31:35 · 261 阅读 · 0 评论 -
状态模式
使用场景:主要用来消除if else这种多条件,主体是可枚举的状态,在实际应用中,比如开关灯,电梯上下这种简单场景,也可以用于有多种操作,各个操作与状态有关系,比如酒店订房。在电商场景中,订单状态跃升可以使用这种模式,总体说来,有多个平行状态且各个状态能进行跃迁的都可以考虑用这种模式。 类图:Context:上下文环境,维护着一个当前状态。 state:状态的抽象类,包含具体操作(可多个,与当前原创 2017-07-28 00:58:49 · 290 阅读 · 0 评论 -
策略模式
使用场景:当我们同一个事情,有多种类似的方法办好时,我们就可以使用策略模式,在电商应用场景中,比如根据会员等级采取不同的打折策略,根据不同货品采用商家发货或系统对接等发货策略。在这些场景中,我们使用策略模式能够降低代码耦合,提升可读性。 类图: Context:为策略环境类,主要是我们要做的事,比如打折,包含策略的引用,常见为一个构造函数。 包含一个操作方法,此方法直接调用策略的方法。 St原创 2017-07-27 23:19:18 · 215 阅读 · 0 评论 -
责任链模式
使用场景: 1.当我们干一件事时,如果可以分成多个步骤进行,我们就可以使用责任链模式。 目前已有设计中,tomcat中的过滤器就是使用了责任链模式。 类图: Handler:可以是抽象类或接口,抽象类的优势在于可以把一些公共的方法提取出来。原创 2017-08-04 00:13:04 · 228 阅读 · 0 评论 -
访问者模式
使用场景: 当我们遇到多个可枚举的对象,且这些对象有相同类似的操作时,我们就可以考虑使用访问者模式,比如支付代理对外的支付相关接口:需要考虑多个支付渠道(支付宝,微信),每个支付渠道都拥有相似的操作接口(wap,web,app支付,退款)。使用访问者模式,将渠道和操作分别组织编写,方便后续扩展和编程友好。类图: Element:对应抽象的支付渠道 ConcreteElement:对应具体的原创 2017-07-24 23:41:50 · 214 阅读 · 0 评论 -
设计模式原则
设计模式有六大原则,可以用SOLID这几个英文单词来记忆。原则体现了面向对象开发的基本思路。单一职责原则一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因开闭原则抽象约束通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法;参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;(针对抽象编程...原创 2019-06-13 10:41:46 · 178 阅读 · 0 评论