设计模式
文章平均质量分 72
codingstyle
Jump for the sun , at least you land on the moon.
展开
-
精心汇总GOF23种设计模式专栏(Java实现)
创建型设计模式SingletonBuilderPrototypeAbstract FactoryFactory Method结构型设计模式AdapterBridgeCompositeDecoratorFacadeFlyweightProxy行为型设计模式Chain of ResponsibilityObserverStateStrategyTemplate MethodInterpreterVisitorMementoIteratorCommand原创 2020-07-28 16:37:01 · 129 阅读 · 0 评论 -
设计模式系列-抽象工厂模式-Abstract Factory
抽象工厂模式简介在之前有一篇文章介绍了工厂方法模式,其中有个例子是为不同格式的XML开发了各自的解析器,然后把解析出来的XML打印出来,现在需求有了变化,为不同的客户端提供一组不同的解析器,加入有个客户端命名为 NY,我们为它提供了一组解析器的名称为 NYErrorXMLParser ,NYFeedBackXMLParser,NYOrderXMLParser,NYResponseXMLParser,同样的,我们以为名为TW的客户端提供一组类似命名的解析器。此时,抽象工厂方法模式无法满足我们的需求,我们将为原创 2020-07-28 16:03:04 · 268 阅读 · 0 评论 -
设计模式系列-工厂方法模式-Factory Method
案例介绍有这样一个场景,一个公司通过XML格式数据与客户通信,他们从客户那里接受订单,订单中发生的错误,上一个订单的反馈,以及对订单的响应信息等都是通过XML格式数据,而且每种通信是不同的XML 格式数据。公司想开发一个应用来完成XML的解析和显示。如果你来研发此应用,你该去如何设计开发呢?首先仔细分析下上面的需求,核心需求是不同的XML格式数据需要不同的解释器,但是处理这些格式的数据的主逻辑都是一样的,从XML数据获取信息然后显示信息。分析完需求后,你可能需要一个工厂生产XML 解析器,而且是在运行原创 2020-07-22 16:09:41 · 237 阅读 · 0 评论 -
设计模式系列-访问者模式-Visitor
案例介绍在正式介绍访问者之前,我们先看一个需求,用java代码组装一个html, 并能输出html 的字符串表示,html 中有各种标签,比如 <html></html ,<body></body>,<p></p> 等, 有的标签可以包含其他标签,如 html,body 等,则有的标签不需要包含,如p 标签只包含一些文字。现在我们来分析需求,根据需求 html 有很多种类的标签,每个标签都有一些共有的属性,如标签名称、开始标记法和结束标记原创 2020-07-21 19:19:52 · 173 阅读 · 0 评论 -
设计模式系列-调停者模式-Mediator
调停者模式简介良好设计的应用由轻量级的对象组合而成,这些对象具有特定的职责,符合SOILD 的单一职责原则。然而,这些大量轻量级的对象给应用带来好处的同时也带来了对象之间交互通信的挑战。对象间需要通信来完成业务需求,当对象数量不断增加时,通信很快变的很难管理。另外,对象之间通信需要感知对方的存在,紧耦合在一起的对象违反了 SOLID 原则。调停者模式被证明可以解决这样的问题。调停者模式定义了一个调停者(Mediator)对象来处理对象之间的交互,进而替代一组对象之间直接交互。下图简单展示有无调停者模式对原创 2020-07-17 10:25:27 · 373 阅读 · 0 评论 -
设计模式系列-解释器模式-Interpreter
解释器模式介绍现实生活中,我们经常碰到需要解释手语的情况,当你看到一个手语时,它代表着一个具体的意思,但是根据不同的文化背景,我们的解释可以不同的意义。类似情况,在编程世界里,应用从不同的来源接收用户的输入信息,比如浏览器、程序界面、命令行、或者手机等。用户输入可以用不同的格式来表示,例如数学计算表达式可以用中缀、前缀、后缀表达法,还有,当一个新的表达法被引入时,我们不需要更改客户端代码,用解释器模式可以自动和灵活的处理用户输入的表达式。解释器模式的目的是处理用户输入的表达式和根据表达式构建抽象语法树原创 2020-07-13 18:17:16 · 268 阅读 · 0 评论 -
设计模式系列-迭代器模式-Iterator
迭代器模式介绍一个集合对象,如List,要提供一个访问它元素的方法,前提是不暴露它的内部结构。此外,你可能根据不同的场景对集合对象选择不同的遍历方法,你不想把遍历逻辑放在对象集合中,这样会增加集合对象的复杂度,你甚至在某个场景下对同一个集合对象进行多次遍历。带着这些前提条件该如何实现集合对象的遍历呢?迭代器模式可以解决上面提出的问题,它的核心思想是提供一个额外的对象负责访问和遍历集合对象。 Iterator 是一个接口负责访问集合的元素,迭代器对象负责记录集合被遍历的当前元素,也就是说它知道集合里的哪原创 2020-07-09 16:37:25 · 137 阅读 · 0 评论 -
设计模式系列-备忘录模式-Memento
介绍我们通常使用的办公软件都有回退功能,你还想过这样的功能是如何实现的呢?相比软件的回退功能比较复杂,我们还是举个对象状态回退的功能,要回退状态,首先得记录对象的历史状态数据,当回退到某个状态时,能从数据存储的地方恢复到对象状态里。通常我们把对象的状态数据封装起来,外部对象无权访问内部状态,如果状态暴露就好违反封装特性,会对应用的可靠性和扩展性作出妥协。备忘录模式可以在不破坏对象封装特性的前提下解决我们上面的问题,也不会暴露对象的内部结构。为了更好的理解备忘录模式,我们举个案例来说明,创建一个类,有两个原创 2020-07-08 19:45:44 · 178 阅读 · 1 评论 -
设计模式系列-责任链模式-Chain of Responsibility
责任链模式介绍责任链模式是一种行为类型的模式,以某种顺序组合一组同类型的对象用来处理一个业务请求,如果组内某个对象处理了请求,处理完毕返回并作出相应的相应(repsone),否则,会把请求按次序转发给组内另一个对象处理。举个现实生活中的例子来更好的理解此模式,假如你有一个难题要解决,如果你能自己解决掉,不会再请别人帮忙,否则,你会请朋友帮忙,如果你朋友也解决不了,他会继续请他的朋友帮忙解决,依次类推直到问题解决,或者最终问题没有解决。类似上面的例子,假如你接到一个需求,帮助一个保健公司做一个分析类的应原创 2020-07-07 17:38:57 · 226 阅读 · 0 评论 -
设计模式系列-策略模式-Strategy
本文我们将讨论策略模式,是非常常用的一个模式,我们应该熟悉掌握,策略模式的定义:定义一系列算法,每个都封装起来可换着使用,策略使算法独立于使用它的客户端而变化。使用策略模式可以使我们的代码设计高内聚、松耦合。策略模式介绍在应用开发中,你将经常编写一些利用不同算法来满足一些业务需求的对象。一个常见的例子是支持数字排序的类,可以用冒泡排序、合并排序和快排。类似的,一个文件压缩类可以支持不同的压缩算法,比如ZIP,GZIP,LZ4 或者一个定制的压缩算法。另一个例子是数据加密类可以用不同的加密算法,例如AES原创 2020-06-28 22:20:03 · 235 阅读 · 0 评论 -
设计模式系列-享元模式-Flyweight
为了更好的理解享元模式,我们需要理解两个概念:- 固有数据:存储在享元对象里,和其他对象共享- 非固有数据:不能共享的数据,存在客户度对象里,用来被计算或者传入享元对象原创 2020-06-24 14:09:50 · 132 阅读 · 0 评论 -
设计模式系列-原型模式-Prototype
原型模式介绍原型模式属于创建对象类型模式,获取一个类的对象时不是每次从头创建一个新对象,而是从先创建类的一个对象作为原型,每次获取对象时从已创建好的对象复制一份。在Java 中,实现原型模式,一般通过对象克隆技术实现。为什么创建对象时是对象复制而不是通过构造方法创建一个对象呢?哪个方式更简单?大部分情况下不需要复制对象,但是在企业应用开发中对性能要求比较苛刻,比如创建一个对象需要调用非常耗时的操作,比如网络请求、读数据库或者读取磁盘文件,创建耗时的逻辑被大量请求,为了提升性能避免重复创建,这时可以用原型原创 2020-06-22 19:02:53 · 166 阅读 · 0 评论 -
设计模式系列-桥接模式-Bridge
桥接模式介绍我们用抽象来解耦客户端代码和实现,通常的做法是用继承(inheritance)的方式。我们定义一个接口或抽象类,然后基于接口或抽象类来创建继承层级,可能会存在多个实现。尽管第一眼看上去此方式从逻辑上好像没啥错误,但不总是不那么灵活。当用继承实现时,我们会自然的把抽象和实现绑定在一起。造成的结果是一端发生变化总会影响到另一方。一个更灵活的方式是分离抽象和实现,这就是桥接模式要做的事情。桥接模式的参与者为了理解桥接模式如何工作的,我们举一个消息发送的例子,客户端可以用我们的消息发送程序来发送不原创 2020-06-18 19:17:26 · 209 阅读 · 0 评论 -
设计模式系列-门面模式-Facade
案例要研发一个任务调度服务,用类 ScheduleServer 表示,客户端代码在调用服务时,需要先初始化完成任务是关掉服务来释放资源,初始化任务调度服务时需依次调用如下方法startBooting() , 启动引导程序readSystemConfigFile(),读取系统配置文件init(),初始化资源initializeContext(),初始化上下文initializeListeners(),初始化监听器createSystemObjects(),创建所需的系统对象关闭任务调度服务原创 2020-06-13 15:10:40 · 201 阅读 · 0 评论 -
设计模式系列-模板方法- Template Method
案例经常做饭的同学都比较熟悉炒菜的流程,主流程是热锅、热油、加配料、放菜翻炒、装碟,每道菜的制作流程基本一致,但是每个步骤对每道菜来讲是不同的,现在要抄两道菜,一是酸辣土豆丝,制作流程:热锅、加豆油、加辣椒和醋、放入土豆丝翻炒、装碟;二是西红柿炒蛋:热锅、加菜籽油、加鸡蛋、放入西红柿翻炒、装碟。以上描述了案例基本需求,下面先介绍模板方法模式的定义,然后用此模式实现案例需求。模板方法模式在一个方法里定义一套算法的骨架并把算法的细节部分委托给子类实现,也就是说,子类实现算法的细节步骤而不会改变算法的整体原创 2020-06-11 16:32:35 · 136 阅读 · 0 评论 -
设计模式系列-状态模式-State
案例接到一个研发做饭机器人的需求,需求比较简单,这个机器人只会做三件事:走路,做饭,关机。做每件事都有前提条件,只有在开机状态下才能走路,做饭和关机,类似的,在做饭状态下可以进行走路或者继续做饭。拿到需求分析后,一种简单的设计和实现是,设计一个类,此类有走路、做饭和关机的方法,在执行方法前,用 if 或者 switch 语句判断当前机器人的状态是否运行执行。这种把状态和方法耦合在一起再加上分支条件判断的方案,代码会随着需求的变化复杂度会增加而且难以维护。有没有有一种设计方案,符合开闭原则-面向新增开放原创 2020-06-06 20:58:18 · 255 阅读 · 0 评论 -
设计模式系列-代理模式-Proxy
代理模式可用于对原始对象增加访问控制或者审计方法参数,或者调用远程的对象方法(RPC),对于客户端来说隐藏业务额外的逻辑和复杂度。原创 2020-06-04 15:27:59 · 131 阅读 · 0 评论 -
设计模式系列-构造器模式-Builder
案例我们有个类,代表银行账户,有一些成员变量,代码如下:public class BankAccount { private long accountNumber; private String owner; private double balance; public BankAccount(long accountNumber, String owner, double balance) { this.accountNumber = accountNu原创 2020-06-02 12:51:34 · 181 阅读 · 0 评论 -
设计模式系列-命令模式-Command
案例我们需要开发一个遥控器,遥控器上的按钮可以开关电灯和空调,这个需求通常的实现如下伪代码:if(buttonPressed == button1){ lights.on()}else if(buttonPressed == button2){ airConditioner.on()}遥控器类 RemoteControl 耦合每个按钮关联的业务实现,比如上面的例子耦合了 light 和 airConditioner,如果业务有新需求需支持电视的控制,类 RemoteControl 的复杂度和原创 2020-05-30 23:23:53 · 185 阅读 · 0 评论 -
设计模式系列-观察者模式-Observer
设计模式系列-观察者模式-Observer需求背景需求分析观察者模式意图参与者参与者结构需求背景一个体育资讯类网站准备为会员提供一个订阅直播体育赛事比分功能,一场直播赛事的比分发生变化会及时通知到订阅该直播的会员,当会员对直播赛事不感兴趣时也可以取消订阅,如果该网站找到你去实现此功能,你该如何实现呢?需求分析核心需求是多人订阅一个直播赛事,会员可以主动订阅和取消订阅,抽象的核心模式是一对多...原创 2020-05-27 15:15:57 · 246 阅读 · 0 评论 -
设计模式系列-单例模式(Singleton)
设计模式系列-单例模式定义实现方式基于类的实现基于枚举的单例定义在一个JVM实例内存中有且只有一个类的实例。实现方式基于类的实现public final class ClassSingleton { private static ClassSingleton INSTANCE; private String info = "Initial info class"; private ClassSingleton() { }原创 2020-05-25 21:33:32 · 178 阅读 · 0 评论 -
设计模式系列-组合模式 (Composite)
组合模式 (Composite)简介类层次和调用关系示例简介从字面意思得知,此模式把多个对象组合起来,以树形的方式组合对象表达 “部分-整体” 的层次结构,因树形节点分为叶子和分叶子,所以这些对象以此类推也分为简单和组合对象,但都实现同一个接口,目的是让调用端统一处理这些对象。类层次和调用关系示例以公司部门组织结构为例,逐层打印部门名称,首先定义核心接口 Departmentpub...原创 2019-06-18 13:00:04 · 252 阅读 · 0 评论 -
设计模式系列-适配器模式(Adapter)
简介别名包装器(Wrapper)使不兼容的两个接口通过适配的方式一起工作,一般是一个老接口通过适配器来适配新接口,因为老接口已经被大量引用,更改老接口会带来较大的工作量和bug隐患。类层次和调用关系图示例项目中数据展示一般会有分页需求,开始阶段我们定义一个接口:OldPagination来表示分页信息,详情如下:public interface OldPagination { ...原创 2019-06-14 17:35:29 · 149 阅读 · 0 评论 -
设计模式系列-装饰者模式(Decorator)
设计模式系列-装饰者模式(Decorator)简介类层次关系图示例简介别名是包装器模式(Wrapper)在运行时可以动态的给一个对象添加功能,不会影响到同一个类的其他对象。通常是通过继承的方式扩展类的功能,但是这种方式会影响类的所有对象。类层次关系图示例代码...原创 2019-06-13 18:51:14 · 137 阅读 · 0 评论