
设计模式
文章平均质量分 93
Guo_j_
坚持学习,持续进步
展开
-
设计模式系列之 模板方法模式
定义在模板方法中定义一个算法的骨架,而将部分步骤延迟到子类中,使子类在不改变算法结构的情况下,重新定义算法中的部分步骤。通常情况下,算法指用于处理某类任务的确切的指令序列,是对处理逻辑的封装。模板方法模式定义中的骨架同样是对处理逻辑的封装,只是它的封装粒度比算法定义的粒度要稍大。模式结构该模式只包含了模板定义者和模板使用者两类。在java实现中,两者存在继承关系,模板定义者为基类,模板使用者为子类。模板基类该类被定义为抽象类,包括模板方法、公共方法、钩子方法、抽象方法。其中不变的共有方法原创 2021-12-07 15:32:54 · 2273 阅读 · 0 评论 -
java的两种比较器
比较算法日常生活中,如果想比较两个数的大小,可采用做差的方式,做差结果的正负可用来判断两个数的大小。假设A - B = C若整数C > 0,说明 A > B ;若整数C = 0,说明 A = B;若整数C < 0,说明 A < B;java的两种比较器均基于以上判断逻辑,将两个待比较的Object经过某种处理,返回一个整数值,然后根据整个整数值的正负判断大小。类似地,自定义实现比较器时,也是同样道理,经过逻辑处理之后,返回一个整数。内部比较器(基于Comparable原创 2021-10-22 11:27:36 · 1776 阅读 · 0 评论 -
设计模式系列之 策略模式
定义定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。策略模式强调的是多个策略之间可以互换,这些策略是同一个接口的不同实现类。模式结构策略模式涉及三种角色抽象策略角色(Strategy)使用接口或抽象类实现,包含所有策略的公共行为规范。特别地,若公共行为以包含方法体的方式出现,而不是接口方法的方式,此时只能使用抽象类作为该角色的实现方式;环境角色(Context)持有一个Strategy引用,供客户端调用;具体策略类(ConcreteStr原创 2021-10-20 19:46:41 · 319 阅读 · 0 评论 -
详解java集合框架中的迭代器模式(Iterator接口 Iterable接口)
在设计模式系列之 迭代器模式中介绍了迭代器模式的基本知识,该模式主要包含了抽象迭代器、具体迭代器、抽象聚合类、具体聚合类。前两个类规范了对聚合类的遍历方式,后两个类主要用于存储数据和提供对应的迭代器。java集合框架涉及的众多类,譬如ArrayList、HashMap等,都可称为用于存储数据的聚合类,并且java的作者也为其提供了对应迭代器。随着java语言的版本更迭,其集合框架使用迭代器模式的方式同样发生了变化。本文基于不同版本JDK,分别介绍迭代器模式在java集合框架(除去Map相关接口)中应用。原创 2021-10-16 18:50:21 · 717 阅读 · 0 评论 -
设计模式系列之 迭代器模式
定义迭代器模式为遍历不同的容器结构提供统一的接口,提供一种方法顺序访问聚合对象中的各个元素,而又不暴露聚合对象内部的表示。迭代器模式的核心思想是数据的存储和遍历分离,同其他设计模式类似,迭代器的分离操作的优缺点共存。需要注意的是,因为每一个聚合对象的底层存储结构不同,因为需要为每一个聚合对象提供对应的迭代器。优点聚合对象只负责存储,遍历由迭代器完成,这就将聚合对象保护起来,外部用户使用只需调用迭代器即可。缺点遍历操作从聚合对象中剥离出去,由单独的迭代器类完成。这就增加了类的数量,进而增加系统的原创 2021-10-15 16:53:20 · 218 阅读 · 0 评论 -
设计模式系列之 抽象工厂模式
定义提供一个接口,该接口创建相关或相互依赖的对象家族,客户端只需调用接口实现类即可获取同族的不同等级的产品。在定义中,产品等级和产品簇是从不同维度对产品进行划分,产品等级从产品的功能出发,产品簇从产品的生产者出发。以华为和小米为例,小米公司生产的所有产品属于同一产品族(族表示有血缘关系),即小米手机和小米手环是同属小米产品族,同样地,华为公司生产的所有产品同属华为产品族。小米公司生产的小米手机和华为公司生产的华为手机同属同一产品等级,小米手机和华为手机虽然没有关系,但他俩都属于手机等级。类似地,还有手环原创 2021-01-05 15:56:45 · 354 阅读 · 0 评论 -
设计模式系列之 工厂方法模式
定义定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。该定义是对生产者一方的描述,包含了四种角色,包括接口、接口实现类、被实例化的类、抽象产品(隐含)。其中接口是指工厂接口(广义接口,在java中可以是接口或者抽象类),该接口定义一个生产产品的方法;接口实现类指工厂接口的实现子类;实例化的类指生产的产品;因为工厂接口中要先给出抽象产品,其子类才能实例化具体的产品;定义中第二句话实际上给出了工厂方法的功能,即让子类决定要实例原创 2020-12-02 16:25:32 · 185 阅读 · 0 评论 -
设计模式系列之 简单工厂模式(静态工厂方法模式)
简单工厂模式(静态工厂方法模式)定义定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中 。这是一种创建型的模式,它不属于23中设计模式,或可称之为一种编程习惯,但他同样满足创建型模式所要求的“创建与使用相分离”的特点,在特定场景的编码实践中,仍具有较高的使用价值。模式结构该模式包含三种元素,工厂、产品、客户端,他们之间的关系为:工厂按客户端要求生产产品,供客户端使用。工厂:类或接口。工厂实例按需创建产品对象。其内部逻辑主要是创建各种产品对象的分支,通过接收客户端传入原创 2020-11-19 11:15:39 · 353 阅读 · 0 评论 -
设计模式系列之设计原则(7)合成复用原则(组合/聚合复用原则)
定义在软件设计过程中,类间关系优先使用组合关系或聚合关系,其次使用继承关系。对于类的复用,分为合成复用和继承复用,两者都为适应需求变化,对系统进行扩展。合成复用原则强调合成关系的重要性,但并不否定继承关系。只是为达到低耦合系统的目标出发,合成带来的优势比继承更大。两者的优缺点对比如下。继承复用主要存在以下优缺点:优点简单易实现缺点继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。子类与父类的耦合度高。父类的实现的任何原创 2020-11-12 21:04:29 · 1202 阅读 · 0 评论 -
设计模式系列之设计原则(5)迪米特法则
定义 只与直接朋友交谈,不和陌生人说话。其软件含义是:如果两个软件实体无需直接通信,那么就不应当发生直接调用关系,而是应该通过第三方转发调用。 理解迪米特法则的关键在于定义中说明的两个词:朋友、说话。“说话”的含义是指类之间的调用行为,即所谓软件实体之间的通信。对于复杂的业务需求,可能产生比较长的通信链路。在通信的过程中,依照迪米特法则,要先判断对方是不是当前类的朋友,能够称得上朋友的软件实体包括以下:当前类对象本身(this)当前类的任何组件(成员变量)当前类的方法参数(输入参数、方法返回原创 2020-11-12 08:47:46 · 277 阅读 · 2 评论 -
设计模式系列之设计原则(6)里氏替换原则
定义从不同出发点,该原则的定义存在以下两种描述方式。定义一从条件出发,得出结论。定义二从结论出发,得出特点。定义一和定义二在描述方向恰好相反,不过两者的目的都是要强调类间建立继承关系时需要遵循的条件。定义一 描述了构成父子关系需要满足的条件,即类间能够透明替换----->是父子关系。如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。定义二 描述了构成父子关系的类原创 2020-11-12 08:48:00 · 239 阅读 · 0 评论 -
设计模式系列之设计原则(4)接口隔离原则
定义1. 客户端不应该依赖它不需要的接口。2. 类间的依赖关系应建立在最小的接口上。以上两个定义描述了接口隔离原则的基本含义:不要建立上帝接口(解决所有问题的接口)或胖接口(解决很多问题的接口),要为类建立需要的专用、小接口。接口隔离实质上是对接口功能进行划分,将不同功能的代码分别“隔离”到不同的接口中。该原则和单一职责原则都要求设计者对业务进行拆分处理,最终达到低耦合高内聚的设计目标。两者的区别在于:约束对象不同。显而易见,接口隔离原则是针对接口层面,包括接口和抽象类,在构建低层基础框架过程中原创 2020-11-12 08:47:14 · 258 阅读 · 0 评论 -
设计模式系列之设计原则(3) 单一职责原则
定义一个类应该有且仅有一个能引起它变化的原因,否则类应该被拆分。 从定义可以看出,“职责”指导致类发生变化的原因,实质上就是项目的业务需求。定义只给出了类,方法和接口同样也可作为单一职责原则适用的对象,本文中以类作为举例,描述内容同样适用于方法、接口。 类对应的职责有改变的潜在区域。超过一个职责,意味着超过一个会发生改变的区域,会提高修改代码的风险。从词义角度出发,遵循单一职责原则似乎很简单,只需将项目划分为若干子模块,各自对应一个类即可。但在编程实践中,区分设计中的责任,也就是我们常说的对业务的原创 2020-11-11 21:36:53 · 334 阅读 · 0 评论 -
设计模式系列之设计原则(2)依赖倒置原则
定义 高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。在依赖倒置原则中,“依赖”不局限于UML中的依赖关系(虚线箭头 局部变量),泛指调用或使用关系,譬如 在A类中用到了B类,则可以简单称A依赖B。“倒置”体现了遵循依赖倒置原则的设计在类图上表现,从词义表面较难理解究竟 什么东西发生了倒置。需要结合场景,分析发生倒置前后的两种类图,对比理解“倒置”的实际含义。假设tyler学习网课,在学网课有java、python、scala,后续还要学习其他网课。按照面向原创 2020-11-11 21:32:03 · 327 阅读 · 0 评论 -
设计模式系列之设计原则(1)开闭原则
在进行软件设计阶段,或者说架构设计阶段,遵循一些设计原则能够搞软件的可读性、复用性、可维护性。在讨论设计模式之前,有必要先掌握设计原则的相关知识,它可以作为评价一个设计是否良好的尺度。本质上,我们所说的设计模式就是对某些设计原则的比较好的实现实例。定义软件实体应当对扩展开放,对修改关闭。其中软件实体包括:项目中划分出的模块类与接口方法其含义是:在软件的生命周期内,因需求变化、升级和维护等原因需要对软件代码修改时,通过扩展软件实体的行为来实现变化,而不是通过修改已有代码来实现变化。通俗的原创 2020-11-11 21:26:50 · 149 阅读 · 0 评论 -
设计模式系列之UML详解
UML基础定义UML是统一建模语言( Unified Modeling Language),也是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。统一是由UML的历史决定的,大体是指UML结合了两个大牛的想法,合成为一个统一的方法。建模就是建立模型,是为了理解事物而对事物做出的一种抽象,一般用来从宏观上研究某些系统的因果关系或者相互关系。UML的M代表了对软件系统的建模。语言说明UML的目标是为了交流,特别地,用于涉及软件开发的人员之间的交流,原创 2020-11-11 21:22:53 · 821 阅读 · 0 评论