![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 86
通过代码解释设计模式
枫陵
这个作者很懒,什么都没留下…
展开
-
设计模式——七大原则(附代码示例)
一. 设计模式概念对接口编程而不是对实现编程;优先使用对象组合而不是继承二. 设计模式总览1. 创建型模式(Creational Patterns):(5)单例(Singleton)模式原型(Prototype)模式工厂方法(FactoryMethod)模式抽象工厂(AbstractFactory)模式建造者(Builder)模式2. 结构型模式(Structural Patterns): ...原创 2022-05-19 15:25:18 · 2688 阅读 · 0 评论 -
设计模式——单例模式八种方式实现与分析(附代码示例)
一. 概念所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new单例模式使用的场景: 需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量...原创 2022-05-20 18:16:49 · 2242 阅读 · 0 评论 -
设计模式——工厂模式(附代码示例)
一. 传统方法以订购披萨为例1. 代码示例将Pizza类做成抽象类,定义准备、烘烤、切割、打包等方法,其中因不同披萨原材料不一样,因此准备的方法做成抽象方法public abstract class Pizza { protected String name; //准备原材料,不同披萨不一样,因此做成抽象方法 public abstract void prepare(); public void setName(String name){ ...原创 2022-05-20 22:41:07 · 3576 阅读 · 2 评论 -
设计模式——原型模式(附代码示例)
一. 传统方法以克隆羊为例1. 代码示例 Sheep类,表示定义羊的模板public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { this.name = name; this.age = age; ...原创 2022-05-21 12:47:11 · 1284 阅读 · 1 评论 -
设计模式——访问者模式(附代码示例)
一. 传统模式以观众(分为男女两类)对歌手评价(分为成功、失败两类)为例1. 传统方式解决通过继承的方式实现男女分类,并直接在类中实现评价方法2. 传统方式问题分析如果系统比较小,还是可以的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则,不利于维护; 且扩展性不好,比如增加了新的人员类型,或者管理方法。故引出访问者模式。二. 访问者模式1. 概念访问者模式(Visitor Pattern),封装一些作用于某种数据...原创 2022-05-25 20:38:14 · 935 阅读 · 0 评论 -
设计模式——策略模式(附代码示例)
一. 传统方式以统计不同鸭子信息为例1. 传统方式解决抽象一个Duck类,不同鸭子继承Duck,如果有相同行为就默认继承,有不同行为就重写类图代码实现Duck抽象类public abstract class Duck { public Duck() { } public abstract void display(); public void quack(){ System...原创 2022-05-27 20:44:08 · 2042 阅读 · 0 评论 -
设计模式——命令模式(附代码示例)
一. 命令模式1. 概念命令模式(Command Patterm),在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计。命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。...原创 2022-05-25 11:17:21 · 1448 阅读 · 0 评论 -
设计模式——模板方法模式(附代码示例)
一. 概念模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。二. 原理类图 Abstra...原创 2022-05-23 22:24:37 · 1184 阅读 · 0 评论 -
设计模式——备忘录模式(附代码示例)
一. 传统方式以游戏角色状态回复(回蓝、回血)为例1. 传统方式解决一个对象对应一个保存对象状态的对象2. 传统方式存在问题一个对象,就对应一个保存对象状态的对象,这样当我们游戏的对象很多时,不利于管理,开销也很大。传统的方式是简单地做备份,new出另外一个对象出来,再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节。故引出备忘录模式二. 备忘录模式1. 概念备总录模式(Memento Pattern...原创 2022-05-26 21:42:15 · 712 阅读 · 2 评论 -
设计模式——桥接模式(附代码示例)
一. 传统方法以对不同类型(折叠式、直立式、旋转式)不同品牌(华为、小米、vivo)的手机操作为例1. 类图2. 传统方式问题分析扩展性问题(类爆炸),如果我们再增加手机的样式(滑盖式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。故引出桥接模式进行解决二. 桥接模式1. 概念桥接模式(B...原创 2022-05-22 11:45:05 · 1600 阅读 · 0 评论 -
设计模式——观察者模式(附代码示例)
一. 传统方式以天气预报以公告形式发送给第三方为例1. 代码示例CurrentConditions类,显示当前天气情况public class CurrentConditions { private float temperature; private float pressure; private float humidity; //更新,第三方调用,推送 public void update(float temperature,...原创 2022-05-26 16:47:36 · 2311 阅读 · 0 评论 -
设计模式——建造者模式(附代码示例)
一. 传统方式以建房子为例1. 代码示例抽象类AbstractHouse,定义抽象的建房流程public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstract void buildWalls(); //封顶 public abstract void roofed(); public vo...原创 2022-05-21 17:15:25 · 813 阅读 · 0 评论 -
设计模式——职责链模式(附代码示例)
一. 传统方式以学校采购审批为例,不同金额的采购需要不同人员的审批1. 传统方式解决收到请求后,通过不同的金额调用对应的审批方法2. 传统方式存在问题Client会使用到分支判断(比如switch)来对不同的采购请求处理, 这样就存在如下问题:(1)如果各个级别的人员审批金额发生变化,客户端的也需要变化(2)客户端必须明确知道有多少个审批级别和访问这...原创 2022-05-27 21:32:20 · 2394 阅读 · 1 评论 -
设计模式——适配器模式(附代码示例)
一. 适配器模式1. 概念适配器模式(Adapter Rattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。类比,U盘插个转换头可用与手机type-c接口相连接;或者是使用多功能转换插头,实现三孔插头与两孔插座相连。2. 工作原理适配器模式将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。从用户的角度看不到被适配者,是解耦的;用户调用适...原创 2022-05-22 10:41:28 · 2665 阅读 · 0 评论 -
设计模式——代理模式(附代码示例)
一. 代理模式1. 概念代理模式为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。2. 代理模式类图 Client不直接调用TargetObject中的方法,而是通过ProxyObject调用TargetObject中的方法3. 代理模式的形式代理模式有不同的...原创 2022-05-23 20:34:54 · 3618 阅读 · 0 评论 -
设计模式——迭代器模式(附代码示例)
一. 传统方式以学校院系展示为例,实现在一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系。传统方式实现类图如下: 传统方式将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的。实际上我们的要求是在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系,而每个院对于系的存储方式各不相同(如数组、集合等),因此这种...原创 2022-05-25 22:15:06 · 4705 阅读 · 1 评论 -
设计模式——解释器模式(附代码示例)
一. 传统方式以实现四则运算为例,如先输入表达式a+b-c,再输入a,b,c的值,最后求结果1. 传统方式解决编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果2. 传统方式问题分析如果加入新的运算符,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰。故引出解释器模式。二. 解释器模式1. 概念在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析...原创 2022-05-27 12:51:10 · 683 阅读 · 0 评论 -
设计模式——装饰者模式(附代码示例)
一. 装饰者模式1. 概念装饰者模式,动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。2. 原理以咖啡订单为例,要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便。客户可以点单品咖啡,也可以单品咖啡+调料组合单品咖啡: Espresso(意大利)、LongBlack(美式)、Decaf(无因)调料: Milk、Soy(豆浆)、Chocolate...原创 2022-05-22 16:15:54 · 620 阅读 · 0 评论 -
设计模式——享元模式(附代码示例)
一. 传统方式以网站项目展示为例,有的要求以新闻形式发布,有的要求以博客形式发布,有的要求以微信公众号形式发布1. 传统方式解决给每个网站租用一个空间,直接复制粘贴一份,然后根据客户不同要求,进行定制修改2. 传统方式存在问题需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费3. 解决思路整合到一个网站中,共享其相关的代码和数据,对于硬...转载 2022-05-23 11:14:16 · 2028 阅读 · 0 评论 -
设计模式——中介者模式(附代码示例)
一. 传统方式以闹铃响起——咖啡机开始做咖啡——窗帘自动落下——电视机开始播放为例1. 传统方式解决创建各个相关类,且各类中彼此联系,最后直接在Client中按照流程执行各类方法2. 传统方式存在问题当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂。各个电器对象彼此联系,你中有我,我中有你,不利于松耦合。各个电器对象之间所传递的消息(参数),容易混乱。当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想。故引出中...原创 2022-05-26 20:45:56 · 1124 阅读 · 0 评论 -
设计模式——状态模式(附代码示例)
一. 状态模式1. 概念状态模式(State Pattern) 主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类2. 状态模式原理类图Context:环境角色,用于维护State实例,这个实例定义当前状态State:抽象状态角色,定义一个接口封装与Context的一个特点接口相关行为Con...原创 2022-05-27 19:46:22 · 1315 阅读 · 0 评论 -
设计模式——外观模式(附代码示例)
一. 传统方式以组建家庭影院为例,DVD播放器、投影仪、自动屏幕环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器,统筹各设备开关;开爆米花机;放下屏幕;开投影仪;开音响;升DVD,选dvd;去拿爆米花;调暗灯光;观影结束后,关闭各种设备。1. 传统方式解决 创建相关对象,在Client端调用创建的各个对象的一系统方法,Client端直接依赖各个对象。2. 传统方式存在问题在Client端,创建各个子系统的对象,并直接...原创 2022-05-22 20:36:02 · 393 阅读 · 0 评论 -
设计模式——组合模式(附代码示例)
一. 传统方式以学校院系展示为例,实现在一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系。传统方式实现类图如下: 传统方式将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的。实际上我们的要求是在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系,因此这种方案, 不能很好实现的管理的操作,比如对学院、系的添加...原创 2022-05-22 18:57:52 · 3736 阅读 · 0 评论