![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
没入门的菜鸟
这个作者很懒,什么都没留下…
展开
-
跟萌新一起学设计模式(十五)之迭代器模式
** 设计模式(十五)之迭代器模式 ** 案例说明 我们要分别对一个城市下面的街道,一个街道下面的建筑进行遍历,但是城市是用集合来装的街道,街道是用数组来装的建筑,我们只希望用一个工具就能分别遍历两种不同数据结构的数据,就可以使用到迭代器模式。 Iterator定义为一个接口,包含了判断有无下一个元素方法和获取当前元素的方法;CityIterator和StreetIterator分别实现了Iterator;City里面用集合来装多个Street,Street里面用数组来装多个Building。原创 2020-10-26 16:58:23 · 135 阅读 · 0 评论 -
跟萌新一起学设计模式(十四)之访问者模式
** 设计模式(十四)之访问者模式 ** 案例说明 我们有一家水果小店,现在老板想要做一个店内水果的评价系统,以三种水果——苹果、香蕉、芒果为例,评价等级有Nice、bad、SoSo,如果我们的水果种类越来越多,评价等级也越来越多,我们的用传统写法来做的话代码维护量就会倍增,所以我们可以用访问者模式来解决这个需求。 访问者模式里面有几种角色——访问者、具体元素(行为、属性)、管理访问者和具体元素的接口(数据结构)。在外面的例子里面,水果是抽象的访问者,苹果、香蕉、芒果是具体的访问者,评价等级可以原创 2020-10-23 17:55:43 · 221 阅读 · 2 评论 -
跟萌新一起学设计模式(十三)之命令模式
** 设计模式(十三)之命令模式 ** 案例说明 我们开了一家水果捞专卖店,老板是想把原先的纸质菜单换成一个类似电子遥控器样式的菜单(如下图)。店里现只有三种水果——苹果、香蕉、芒果,顾客需要加哪种水果就点哪个,这里我们就用命令模式来解决这个需求。 命令模式一般有三大角色,下达命令者、接收命令者、命令,上图中顾客就是下达命令者,水果就是接收命令者,命令就是顾客的需要与不需要的操作。命名模式使得下达命令者与接收命令者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 我们将命令原创 2020-10-23 11:17:55 · 172 阅读 · 0 评论 -
跟萌新一起学设计模式(十二)之模板模式
** 设计模式(十二)之模板模式 ** 案例说明 我们想要手工制作一个蛋糕,假如我们不知道制作的步骤,那就可以找个蛋糕制作的模板步骤来参考制作,我们不需要去考虑哪一步应该在什么时候做,这就是模板模式。 Cake是一个抽象类,包含了抽象方法purchase,具体的已经实现的方法有prepare、mix、baking、addCream,钩子方法isPurchase,模板方法make;其子类ChocolateCake、FruitsCake、IceCreamCake分别去继承Cake,实现Cake的抽原创 2020-10-22 15:39:15 · 156 阅读 · 0 评论 -
跟萌新一起学设计模式(十一)之代理模式
** 设计模式(十一)之代理模式 ** 案例说明 我们有一个面点师的实体类,里面有一个制作面包的方法,我们调用这个方法时,不仅想要制作面包,还需要在之前采购原料、之后吃面包,但我们不想或者是不能改变这个面点师类里面的代码,所以我们就可以考虑使用代理模式来解决问题。 代理模式一般分为静态代理模式、动态代理模式和cglib代理模式(有些地方会把cglib归为动态代理模式),我们先看一下静态代理模式的类图和代码: 静态代理模式 在面点师实体类之上定义了接口让面点师实体类来实现,代理类实现面点原创 2020-10-21 20:36:51 · 148 阅读 · 0 评论 -
跟萌新一起学设计模式(十)之享元模式
** 设计模式(十)之享元模式 ** 案例说明 享元模式中有几个角色: 1、抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。 2、具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。 3、非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。 4、享元工厂(Flyweight Factory)角色原创 2020-10-21 16:04:23 · 115 阅读 · 0 评论 -
跟萌新一起学设计模式(九)之外观模式
** 设计模式(九)之外观模式 ** 案例说明 在一个悠闲的周末早晨,你一个人待在家里不想做饭,但不做又饿得慌,所以只能自己做饭、吃饭、洗碗,想想都麻烦,我们先看看这样做的UML类图: 不用外观模式的传统写法 用Client模拟要做饭吃饭洗碗的自己,午饭我们要吃蛋糕和汉堡,那就得自己做蛋糕、做汉堡、吃蛋糕、吃汉堡、收拾蛋糕的餐具、收拾汉堡的餐具;晚饭我们要吃饼干和披萨,那就得自己做饼干、做披萨、吃饼干、吃披萨、收拾饼干的餐具、收拾披萨的餐具,很麻烦。所以我们就想到雇一个人来帮我们做午晚饭和原创 2020-10-20 18:10:13 · 114 阅读 · 0 评论 -
跟萌新一起学设计模式(八)之组合模式
** 设计模式(八)之组合模式 ** 案例说明 假设我们要操作(添加或删除)和查询城市、街道和楼房的数据,城市、街道和楼房之间有层级归属关系,我们就可以使用到组合模式。可以在最上层定义一个抽象的地址类 AddressComponent,包含了已经默认实现的几种方法,还有抽象方法print(),其实现的子类视情况重写在AddressComponent默认实现的方法。 AddressComponent的子类有City,Street,Building,同时AddressComponent的子类又将原创 2020-10-20 11:26:19 · 112 阅读 · 0 评论 -
跟萌新一起学设计模式(七)之装饰者模式
** 设计模式(七)之装饰者模式 ** 案例说明 假设我们去一家卖电脑的店买电脑,店里面有戴尔电脑、联想电脑、惠普电脑,这三种电脑本身的价格都是只包括主机和屏幕,如果要买鼠标、键盘、耳机等配件需要另外加钱,如果我们要计算每种组合的价钱,用传统写法的话那就要定义很多类了,一旦要增加一种电脑的品牌或者是一种电脑配件,那类的数量就会变得极其庞大,这里我们只列出电脑+其中一种配件的组合情况来稍微感受一下传统写法可能会造成的“类爆炸”情况: 可以看出,单单是电脑+一种配件的组合情况就要建这么多的类,下面原创 2020-10-19 16:04:30 · 189 阅读 · 0 评论 -
跟萌新一起学设计模式(一)之单例模式
** 设计模式之单例模式 ** 前言说明 本人工作一段时间后,无意间在B站看完了韩顺平老师的设计模式课程,深感自己的不足,故借助课程与自己之前工作遇到的实例来进行设计模式课程的学习和巩固。 单例模式的特点 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功原创 2020-10-10 18:55:14 · 199 阅读 · 0 评论 -
跟萌新一起学设计模式(六)之桥接模式
** 设计模式(六)之桥接模式 ** 案例说明 我们要品尝一种水果,假设有六种水果:红色苹果、绿色苹果、红色葡萄、绿色葡萄、红枣、青枣,传统写法就要有六个实体类,一旦我们要增加一种水果的颜色或者一个水果的种类,那相对应的实体类就会增加很多,也就会产生我们所说的“类爆炸”问题,我们先来看看传统的写法: 不用桥接模式的传统写法 抽象的水果类 public abstract class Fruit { public abstract void taste(); } 具体的水果类 pub原创 2020-10-16 11:37:41 · 105 阅读 · 0 评论 -
跟萌新一起学设计模式(五)之适配器模式
** 设计模式(五)之适配器模式 ** 案例说明 适配器模式很经典的一个例子就是充电器转接头的代码实现,而本文模拟现实业务中当我们对一个固有接口的返回值不满意时,我们在中间加上一个加工返回值的适配器,经转换后达到满足我们需求的例子来体现适配器模式的写法和优缺点。 适配器模式一般有几个角色:被适配者(资源类、源对象)、适配器 、目标对象 、使用者。适配器模式按照适配器整合被适配者的方式,一般分为类适配器模式、对象适配器模式、缺省(接口)适配器模式。下面结合UML类图和代码一起说明。 类适配器原创 2020-10-15 15:43:58 · 111 阅读 · 0 评论 -
跟萌新一起学设计模式(四)之建造者模式
** 设计模式(四)之建造者模式 ** 案例说明 本文以创建一个电脑实体类的例子来体现建造者模式的写法和优缺点,并对传统意义上的建造者模式进行一定程度的魔改,结合UML类图和代码一起说明。 不用建造者模式的传统写法 我们通过对同一个实体类中不同的属性设置具体的值来模拟现实业务中建造某种商品的过程,故可以通过构造器或者是set方法来模拟实现。以下是UML类图和代码实现: 电脑实体类 @Data @NoArgsConstructor @AllArgsConstructor public c原创 2020-10-14 17:04:55 · 191 阅读 · 0 评论 -
跟萌新一起学设计模式(三)之原型模式
** 设计模式(三)之原型模式 ** 案例说明 本文以获取多个属性相同但hashCode不同的市场实体类(内含水果实体类的引用类型属性)的实例对象的例子来体现原型模式的写法和优缺点,并对深拷贝和浅拷贝进行区分,结合UML类图和代码一起说明。 不用工厂模式的传统写法 我们在创建一个市场对象之后,想要再创建一个属性相同的市场对象,但两个对象所指向的内存地址不一样,传统写法可以直接new一个对象,并把原对象的属性set到新对象中去。 市场实体类 @Data @AllArgsConstruct原创 2020-10-13 14:58:32 · 97 阅读 · 0 评论 -
跟萌新一起学设计模式(二)之工厂模式
** 设计模式(二)之工厂模式 ** 案例说明 本文以生产汽车和电池的例子来体现三种工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)的写法和优缺点,结合UML类图和代码一起说明。 不用工厂模式的传统写法 有三种车,电动车、汽油车和太阳能车,每次卖车店要预订车子都要直接跟具体的汽车类型有关联,每次要新增一种车型都要修改多处代码,扩展性低,耦合性高。 @Data public abstract class Car { /** * 车的名称,ElectricCar为电动车原创 2020-10-12 20:08:52 · 333 阅读 · 4 评论