设计模式
文章平均质量分 88
该专栏为笔者个人设计模式的学习总结。
具体笔记中的代码可前往Github仓库查看:https://github.com/zhaohaihao/java-design-patterns
黑豪Horace
这个人很懒。
展开
-
Java设计模式之行为型-状态模式 (State)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义当一个对象的内在状态改变时允许改变其行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。可以将状态的判断逻辑转移到表示不同状态的一系列类当中,从而简化复杂的判断逻辑。三个角色状态模式主要有以下三个角色:环境类Context:也叫做上下文,维护一个当前状态,并将与状态相关的操作委托给...原创 2020-03-03 23:27:23 · 507 阅读 · 1 评论 -
Java设计模式之行为型-访问者模式 (Visitor)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式的核心就是根据不同的访问者对相同的数据产生不同的操作行为。五个角色访问者...原创 2020-03-03 18:03:15 · 541 阅读 · 1 评论 -
Java设计模式之行为型-责任链模式 (Chain of Responsibility)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义使多个对象都有机会去处理请求。从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式也叫做职责链模式。三个角色责任链模式主要有以下三个角色:抽象处理者Handler:定义一个处理请求的接口,内部包含一个后继处理者的引用。具体处理者C...原创 2020-03-03 15:54:04 · 557 阅读 · 1 评论 -
Java设计模式之行为型-中介者模式 (Mediator)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。四个角色中介者模式主要有以下四个角色:抽象中介者Mediator:提供了注册同事对象与转发同事对象信息的抽象方法。具体中介者Concrete Mediator:管理同事对象类,协调...原创 2020-03-03 13:23:24 · 329 阅读 · 1 评论 -
Java设计模式之行为型-命令模式 (Command)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。四个角色命令模式主要有以下四个角色:抽象命令类Command:声明执行操作的接口。具体命令类Concrete Command:是抽象命令类的具体实现类,持有接受者对象,同时通过调用接收者的功能来完成命令要执行的操作。接收者Receiver...原创 2020-03-02 17:23:04 · 308 阅读 · 1 评论 -
Java设计模式之行为型-备忘录模式 (Memento)
行为型-备忘录模式 (Memento)????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义在不破坏封装性的前提下,捕获一个对象的内部状态,并且在该对象之外保存这个状态,从而可以在将来合适的时候把这个对象还原到之前保存的状态。备忘录模式也叫快照模式。三个角色备忘录模式主要的角色有以下三个:发起人Originator:负责创建一个备忘录,记录当前时刻发起人的...原创 2020-03-02 12:10:28 · 336 阅读 · 1 评论 -
Java设计模式之行为型-观察者模式 (Observer)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者(观察者)都会收到通知并且自动更新。观察者模式提供了一种对象设计,让观察者和被观察者(主题)之间松耦合。四个角色观察者模式的主要角色有以下四个:抽象主题角色Subject:将所欲对观察者对象的引用保存在一个集合里,每个主题都可以有任...原创 2020-03-02 00:09:11 · 448 阅读 · 1 评论 -
Java设计模式之行为型-解释器模式 (Interpreter)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。定义中提到的文法和句子的概念同编译原理中的描述相同,“文法”指的语言的语法规则,而“句子”是指语言集中的元素。四个角色解释器模式主要有四个角色:环境角色Context:包含解释器之外的一些全局信息。抽象表达式...原创 2020-03-01 19:24:11 · 351 阅读 · 1 评论 -
Java设计模式之行为型-策略模式 (Strategy)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。三个角色策略模式中主要有三个角色:抽象策略类Strategy:定义所有支持的算法的公共接口,可以是接口也可以是抽象类。具体策略类Concrete Strategy:封装具体的算法或者行为。环境类Conte...原创 2020-02-28 17:59:28 · 298 阅读 · 1 评论 -
Java设计模式之行为型-迭代器模式 (Iterator)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。四个角色迭代器模式主要有以下四个角色:抽象聚合角色Aggregate:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。具体聚合角色Concrete Aggregate:实现抽象聚合类,返回一个具体的迭代器实例。抽象迭代器Iter...原创 2020-02-28 15:47:15 · 274 阅读 · 1 评论 -
Java设计模式之行为型-模板方法模式 (Template Method)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义定义一个算法的步骤,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。场景示例笔者这里以做番茄炒蛋为例。笔者将做番茄炒蛋的步骤分为以下几步:倒油、放鸡蛋、放番茄、倒调料、翻炒。不考虑多余的细节问题,不同的人做番茄炒蛋的步骤应该是类似的。创建抽象模板...原创 2020-02-27 16:42:42 · 231 阅读 · 1 评论 -
Java设计模式之结构型-代理模式 (Proxy)
结构型-代理模式 (Proxy)????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义为其他对象提供一种代理用来控制对这个对象的访问。在代理模式中,代理对象作为访问对象和目标对象之间的中介。场景示例笔者这里以购买火车票为例。我们购买火车票不一定要去火车站购买,我们可以通过12306网站或者去火车票代售点购买。基于继承的静态代理实现创建目标对象/** *...原创 2020-02-26 23:31:08 · 462 阅读 · 1 评论 -
Java设计模式之结构型-桥接模式 (Bridge)
结构型-桥接模式 (Bridge)????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。桥接模式是通过组合的方式建立两个类之间的联系,而不是通过继承。四个角色桥接模式中主要有以下四个角色:抽象化角色Abstraction:定义抽象类,同时包含一个对实现化对象的引用。扩展抽象化角色Refined A...原创 2020-02-26 15:47:07 · 394 阅读 · 1 评论 -
Java设计模式之结构型-组合模式 (Composite)
结构型-组合模式 (Composite)????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。模式中的角色抽象构件Component:为组合中的叶节点对象和分支节点对象声明公共接口并实现它们的默认行为。树叶构件Leaf:是组合中的叶节点对象,叶节点没有...原创 2020-02-22 17:03:34 · 2497 阅读 · 1 评论 -
Java设计模式之结构型-享元模式 (Flyweight)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义运用共享技术有效地支持大量细粒度的对象。“享”即共享,“元”指的是元件,也就是小颗粒的东西。“享元”顾名思义就是共享小部件。很多的系统程序包含大量的对象,但是这些对象绝大多数都是差不多的,除了一些极个别的属性外。那么也就是说,在一个系统程序中有多个相同对象的时候,我们只需要共享一份就可以了,不必去实例化每一个...原创 2020-02-16 23:41:00 · 245 阅读 · 1 评论 -
Java设计模式之结构型-适配器模式 (Adapter)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义将一个类的接口转换成客户端期望的另一个接口。适配器模式可以使原本接口不兼容的类可以一起工作。两种模式适配器模式有两种模式:对象适配器:采用组合方式进行类的委托类适配器:采用继承方式三种角色目标角色(Target):客户端所期待的接口(也可以是具体类或者抽象类)。源角色(Adaptee):被适配...原创 2020-02-14 19:21:22 · 405 阅读 · 1 评论 -
Java设计模式之结构型-装饰器模式 (Decorator)
????文章示例代码????装饰器模式对于笔者来说,印象还是比较深刻的。因为当年笔者考软件设计师的设计模式大题考的就是这个模式,差点阵亡。附链你也可以在这些平台阅读本文:语雀个人博客定义动态地为一个对象添加一些额外的职责。在扩展原有对象功能上,装饰器模式比继承的方式更加灵活。模式中的角色抽象构建(Component):定义一个抽象接口(可以是抽象类),用以给对象动态地添加职责。...原创 2020-02-14 00:52:22 · 254 阅读 · 1 评论 -
Java设计模式之结构型-外观模式 (Facade)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又叫门面模式,是符合迪米特法则的。场景示例作为一个病人去医院看病,可能需要经过挂号、门诊、划价、取药这几个步骤。相对来说过程可能较为繁琐,先来看下代码层面是如何实现的。创建实体类/** * @...原创 2020-02-13 17:13:17 · 384 阅读 · 1 评论 -
Java设计模式之创建型-原型模式 (Prototype)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式不需要知道任何创建的细节,也不调用构造函数。三个基本步骤原型模式的核心在于原型类,而满足原型模式的原型类需要进行以下三个步骤:实现Cloneable接口。 Cloneable 接口实际上是个空接口(标记接口)。表明只有实现该接口才能够...原创 2020-02-13 11:53:40 · 340 阅读 · 1 评论 -
Java设计模式之创建型-单例模式 (Singleton)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义保证一个类有且仅有一个实例,并且提供一个可以访问它的全局访问点。三个基本步骤实现单例模式有三个基本的步骤:私有构造方法用来限制外部类对其直接实例化提供一个私有静态当前类的对象作为变量提供一个公有静态方法返回类的实例实现单例模式的几种方式懒汉式懒汉式单例模式在类创建的时候不会创建实例,因此类的加载...原创 2020-02-12 18:07:03 · 286 阅读 · 1 评论 -
Java设计模式之创建型-建造者模式 (Builder)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。建造者模式注重于方法的调用顺序,而工厂模式注重于创建产品。四要素标准建造者模式有四个要素:**产品类:**既可以是具体的实体类,也可以是抽象类与其具体实现组成。...原创 2020-02-12 15:03:22 · 418 阅读 · 1 评论 -
Java设计模式之创建型-抽象工厂模式 (Abstract Factory)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义提提供一个创建一系列相关或者相互依赖对象的接口,无须指定他们的具体的类,从而创建多个产品族中的产品对象。在讲抽象工厂模式之前,这里先引入两个概念,以便更好地了解抽象工厂模式(以下用工厂方法模式中的示例为例)。**产品族:**在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品层次结构中的一组产品。比如...原创 2020-02-12 15:01:11 · 227 阅读 · 1 评论 -
Java设计模式之创建型-工厂方法模式 (Factory Method)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法模式让类的实例化推迟到子类中进行。场景示例笔者这里通过简单工厂模式中示例的演变来进行讲解。/** * @author zhh * @description 手机工厂类 * @date 2020-02-10 11:09 */pu...原创 2020-02-12 14:58:52 · 385 阅读 · 1 评论 -
Java设计模式之创建型-简单工厂模式 (Simple Factory)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义一个工厂方法,根据传入的不同参数,生成对应的具体实例化对象。简单工厂属于创建性模式,但是其不属于GOF23种设计模式场景示例假设笔者拥有很多品牌的手机(虽然笔者没有),这里以笔者选择品牌手机打电话作为示例。创建基类(可以是接口或者是抽象类)创建基类,基类可以是接口或者是抽象类。这里以创建手机接口为例。/...原创 2020-02-12 14:55:51 · 258 阅读 · 1 评论 -
Java设计模式之设计原则-合成复用原则 (CRP)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义尽量使用对象组合(contains-A)/聚合(has-A),而不是通过继承(is-A)达到软件复用的目的。类的复用一般分为两种:一种是组合/聚合,另一种则是继承。继承复用的优点在于扩展性较好,子类继承父类,父类的大部分功能都可以提供给子类使用,修改和扩展相对比较容易。继承复用的缺点在于这种方式会破坏包装,继...原创 2020-02-12 14:52:28 · 1039 阅读 · 1 评论 -
Java设计模式之设计原则-里氏替换原则 (LSP)
附链你也可以在这些平台阅读本文:语雀个人博客定义任何基类可以出现的地方,子类一定可以出现。里氏替换原则是继承复用的基石,只有当子类可以替换掉基类且软件单位的功能不受到影响的时候,基类才能真正被复用,而子类也能够在基类的基础上去增加新的行为。里氏替换原则通俗点来说就是:子类可以扩展父类的功能,但不能改变父类原有的功能。通过以上这句话,可以引申出以下几点含义:**含义一:*...原创 2020-02-12 14:49:40 · 418 阅读 · 1 评论 -
Java设计模式之设计原则-迪米特法则 (LoD)
????文章示例代码????迪米特法则也叫做最少知道原则。附链你也可以在这些平台阅读本文:语雀个人博客定义一个对象应该对其他对象保持最少的了解。在《Head First 设计模式》一书中,针对该原则也强调:只和你的密友交流。在程序中,出现在成员变量、方法的输入、输出参数中的类我们可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。这些个成员朋友类的对象和当前对象之间存在关联、...原创 2020-02-12 14:45:34 · 285 阅读 · 1 评论 -
Java设计模式之设计原则-接口隔离原则 (ISP)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义用多个专门的接口,而不使用单一的总接口,客户端不应该被迫依赖于它不使用的方法。注意点一个类对另一个类的依赖应该建立在最小的接口上建立单一接口,不要建立一个庞大臃肿的接口尽量细化接口,接口中的方法尽量少注意适度原则(接口太小会导致接口数量过多,设计变得复杂)场景示例创建动物接口创建一个动物的接口,...原创 2020-02-12 14:42:07 · 419 阅读 · 1 评论 -
Java设计模式之设计原则-单一职责原则 (SRP)
????文章示例代码????附链你也可以在这些平台阅读本文:语雀个人博客定义就一个类而言,有且仅有一个引起它变更的原因。一个类/接口/方法只负责一项职责。如何理解假设有个 A 类负责职责1和职责2两个职责。当需求发生变更时,比方说职责1相关的功能需要发生改变,那我们在修改 A 这个类的时候就有可能会导致原本运行正常的职责2发生故障。也就是说对于这个 A 类来说,当职责1和职责2的...原创 2020-02-12 14:37:49 · 389 阅读 · 1 评论 -
Java设计模式之设计原则-依赖倒置原则 (DIP)
????文章示例代码????定义高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。针对接口编程,而不要针对实现编程。场景示例假设笔者现在要去超市购物,需要买点可乐和薯片。这一过程笔者分别用面向实现和面向过程两种方式进行实现。面向实现编程创建实体类创建一个人物实体类,同时在人物实体类内部实现购买可乐和购买薯片的两个方法。/** * @author ...原创 2020-02-12 14:29:44 · 353 阅读 · 1 评论 -
Java设计模式之设计原则-开闭原则 (OCP)
设计原则-开闭原则 (OCP)????文章示例代码????定义一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。开闭原则强调的是用抽象构建框架,用实现来扩展细节。场景示例笔者这里以超市中的商品做一个简单的示例来方便理解。创建商品接口首先创建一个商品接口,同时在接口内部定义获取商品ID、名称、价格的各个方法。一般来说,一个商品是一个实体,后续我们可以去写一个类包含商品ID、名称、价格这...原创 2020-02-12 14:02:43 · 555 阅读 · 1 评论