设计模式
文章平均质量分 90
~Rookie~Newbie~Noob~
这个作者很懒,什么都没留下…
展开
-
设计模式之职责链模式
OA系统采购审批需求学校OA系统的采购审批项目,需求是:采购员采购教学器材如果金额小于50000,由教学主任审批如果金额小于100000,由院长审批如果金额小于300000,由副校长审批如果金额超过300000,由校长审批设计程序完成采购项目。传统方式解决采购审批需求传统方式是:接收到一个采购请求后,根据采购金额,调用对应的Approver(审批人)完成审批。客户端会用到分支判断,根据不同的金额选择不同的Approver审批,但是会存在如下问题:如果各个级别的人员审批金额发生原创 2021-09-17 20:42:02 · 105 阅读 · 0 评论 -
设计模式之策略模式
鸭子问题编写鸭子项目,具体要求如下:有各种鸭子(比如野鸭、北京鸭、水鸭等,且鸭子有各种行为,如飞、叫等)。像是鸭子的信息。传统方式解决鸭子问题UML类图该方案存在的问题所有鸭子都继承Duck类,所以fly让所有鸭子(子类)都会飞,这是不正确的。父类的局部改动,会影响所有子类。溢出效应。子类可以通过重写fly方法来解决上面的问题。如果从父类继承过来的所有方法都不合适,那么所有的方法都要重写一遍。策略模式基本介绍策略模式中,定义算法族,分别封装起来,让他们之间可以相互原创 2021-09-17 18:33:39 · 125 阅读 · 0 评论 -
设计模式之状态模式
APP抽奖活动需求请编程程序完成APP抽奖活动,具体要求如下:假如每参加一次这个活动,要扣除用户50积分,中将概率是10%。奖品数量固定,抽完为止。活动中有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完。状态转换关系图:...原创 2021-09-17 16:31:14 · 87 阅读 · 0 评论 -
设计模式之解释器模式
四则运算问题通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求 :先输入表达式的形式,比如 a+b+c-d+e,要求表达式的字母不能重复。再分别输入a,b,c,d,e的值。最后输出运算结果。解释器模式基本介绍在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看作是解释器。解释器模式:是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,是用该解原创 2021-09-17 09:57:23 · 95 阅读 · 0 评论 -
设计模式之备忘录模式
游戏状态恢复问题游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。备忘录模式基本介绍备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。可以这样理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的协定,以防忘记。而在软件层面上,备忘录有相同的含义,备忘录的对象主要用来原创 2021-09-16 16:57:37 · 89 阅读 · 0 评论 -
设计模式之中介者模式
智能家庭项目只能家庭包括各种设备:闹钟、咖啡机、电视机、窗帘等。主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作。比如:闹钟响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放。中介者模式基本介绍中介者模式,用一个中介对象来封装一些列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式属于行为型设计模式,使代码易于维护。比如MVC模式,Controller控制器是Model模型和View视图原创 2021-09-16 16:16:28 · 90 阅读 · 0 评论 -
设计模式之观察者模式
天气预报需求气象站可以将每天测量到的温度、湿度、气压等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口。测量数据更新时,要能实时的通知给第三方。传统方式解决天气预报需求方式一:推送方式解决这种方式解决需求,需要:当气压、温度、湿度发生变化时,通过dataChange()方法改变原来的值。由于CurrentConditions是聚合在WeatherData中,因此,数据变化是,在dataCha原创 2021-09-16 15:23:58 · 76 阅读 · 0 评论 -
设计模式之迭代器模式
具体需求编写程序展示一个学校的院系结构:需求是这样的,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。关键点是遍历,但是如何遍历呢?比如 计算机学院的系是存放在数组Array中的,而信息工程学院的系是放在集合List中的。迭代器模式基本介绍迭代器模式是常用的设计模式,属于行为型模式。如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其它方式。当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴漏元素的内部结构,可以考虑使用原创 2021-09-16 14:16:17 · 82 阅读 · 0 评论 -
设计模式之访问者模式
测评系统需求将观众分为男人和女人,对歌手进行评测。当看完某个歌手表演后,得到他们对该歌手不同的评价(成功、失败)。传统方案,对将Man和Woman分别继承Person类。而对某个歌手进行评价,需要在Man类中和Woman类中,都需要增加类型如下一段代码:if() { 给与成功评价} else { 给与失败评价}试想,这中继承方案带来的问题:违反了OCP原则,既如果新增一种评价(如:不好不坏),需要修改原来的代码。如果按照年龄段来划分人,那么改动就更大了。访问者模式基本介绍访问者原创 2021-09-15 18:41:03 · 81 阅读 · 0 评论 -
设计模式之命令模式
智能生活项目需求我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装 app 就可以控制这些家电工作。这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个app,而是只要一个 app 就可以控制所有的智能家电。要实现一个app控制所有的智能家电的需求,则每个家电厂家都要提供统一接口给 app 调用,这时可以考虑使用命令模式。命令模式将“动作的请求者”从“动作的执行者”对象种解耦出来。以上例子,动作请求者为app,而动作的执行者时每个厂商的一个家电产品。命令模式基原创 2021-09-15 17:04:14 · 81 阅读 · 0 评论 -
设计模式之模板方法模式
豆浆制作问题编写制作豆浆的程序,说明如下:制作豆浆的流程:选材->添加配料->浸泡->放到豆浆机打碎。通过添加不同的配料,可以制作出不同口味的豆浆。选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的。请使用模板方法模式完成。模板方法模式基本介绍模板方法模式,又叫模板模式。在一个抽象类公开定义了执行它的方法模板。它的子类可以按需重写方法,但调用将以抽象类中定义的方法进行。简单说:模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类原创 2021-09-15 15:54:56 · 90 阅读 · 0 评论 -
设计模式之代理模式
代理模式基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以时远程对象、创建开销大的对象或需要安全控制的对象。代理模式有不同的形式,主要有三种:静态代理、动态代理和Cglib代理。静态代理基本介绍静态代理在使用时,需要定义接口或者父类。被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同的父类。代码实现UML 类图代码实现原创 2021-09-15 11:52:37 · 91 阅读 · 0 评论 -
设计模式之享元模式
展示网站的项目需求小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求有些不同:有客户要求以新闻的形式发布。有客户要求以博客的形式发布。有客户希望以微信公众号的方式发布。享元模式基本介绍享元模式也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象。常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中我们需要的则直接拿来用,避免重新创建;如果没有我们需要的,则创建一个。享元模式能够解决重原创 2021-09-14 22:11:44 · 131 阅读 · 0 评论 -
设计模式之外观模式
影院管理项目组件一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,器过程为:直接用遥控器,统筹各设备开关。开爆米花机放下屏幕开投影仪开音响开DVD,旋转DVD去拿爆米花调暗灯光播放电影10.观影结束后,关闭各种设备传统方式解决影院管理问题该方式存在的问题在Client的main方法中,创建各个子系统的对象,并直接调用子系统的相关方法,会造成调用过程混乱,没有清晰的过程。不利于在Client中维护对各子系统的相关操作。解决原创 2021-09-14 20:24:03 · 113 阅读 · 0 评论 -
设计模式之组合模式
学校院系展示需求编写一个程序展示一个学校院系结构:要在一个页面展示出学校的院系组成。一个学校有多个学院,一个学院有多个系。传统方式解决学校院系问题将学院看作是学校的子类,系是学院的子类。这样其实是站在组织大小来进行分层次的。实际上我们的要求是:在一个页面上分层展示出所有的学院和系,便于直观了解系与学院之间的关系。因此这种方案不能很好的实现管理操作。比如对学院、系的添加,删除、遍历等 。把学校、学院、系都看作是组织结构,他们之间不是继承关系,而是一个树形结构,更好地实现管理操作。组合模式组原创 2021-09-14 14:24:41 · 94 阅读 · 0 评论 -
设计模式之装饰者模式
星巴克咖啡订单项目单品咖啡的种类有:Espresson(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)。调料:Milk、Soy、Chocolate要求在扩展新的咖啡种类时,具有良好的扩展性,改动方便、维护方便。使用OO的方式来计算不同种类开发的费用:客户可以点单品咖啡,也可以单品咖啡+调料。方案一、原理和咖啡组合传统直观的方式解决这个需求,最明显的问题就是类会爆炸式增加。不利于产品的维护和迭代。因为每加一种原理,可能就会涉及到跟其它原料和咖啡的原创 2021-09-14 13:13:24 · 130 阅读 · 0 评论 -
设计模式之桥接模式
手机操作问题现在对不同类型(旋转、直立、折叠)、不同品牌(华为,苹果,小米,google,Vivo)的手机实现操作(比如:开机,关机,上网,打电话等)。传统方式解决手机操作通过UML类图,我们知道,传统方式解决手机操作问题,会出现类爆炸现象。违反了单一职责原则。当我们增加手机样式时,需要同时增加所有品牌的手机,这样增加了代码的维护成本。桥接模式基本介绍桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。桥接模式是一种结构型设计模式。Brid原创 2021-09-14 00:13:12 · 74 阅读 · 0 评论 -
设计模式之适配器模式
旅游中使用插座问题现实生活中的适配器例子,泰国插座使用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样去泰国旅游就可以给电脑或手机充电了。适配器模式基本介绍适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示。主要的目的是兼容性,让原本接口不匹配不能再一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。适配器模式属于结构型模式主要分三类:类适配器、对象适配器、接口适配器。工作原理适配器模式:将一个类的接口转换成另一个接口。让原创 2021-09-13 19:27:47 · 96 阅读 · 0 评论 -
设计模式之建造者模式
项目需求盖房子项目需求需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房、高楼、别墅,建立各种房子的过程是一样的,但是要求是不同的。请编写程序,完成需求。常规方式实现需求UML类图代码实现AbstractHouse 类:public abstract class AbstractHouse { // 打地基 public abstract void buildBasic(); // 砌墙 public abstract void bu原创 2021-09-13 11:50:50 · 84 阅读 · 0 评论 -
设计模式之原型模式
问题现在又一只羊,姓名为tom,年龄1,颜色是白色。请编写程序创建和tom羊属性完全相同的10只羊。最直观的实现方式UML类图代码实现Sheep代码:public class Sheep { private String name; private String color; private int age; public Sheep(String name, String color, int age) { this.name = name原创 2021-09-12 23:07:15 · 87 阅读 · 0 评论 -
设计模式之工厂模式
看一个具体需求看一个披萨订购的项目:要便于披萨种类的扩展,更要便于维护。披萨种类很多(比如GreekPizz、CheesePizz等)披萨制作流程有 prepare,bake,cut,box等完成披萨店订购功能。传统方式实现该需求UML 类图代码实现Pizza 代码:public abstract class Pizza { private String name; public abstract void prepare(); public void ba原创 2021-09-10 23:14:41 · 76 阅读 · 0 评论 -
设计模式之单例模式
学习设计模式的层次第一层:刚开始学编程不久,听说过什么是设计模式。第二层:有很长时间的编程经验,也写了很多的代码,其中用到了设计模式,但是自己还不知道。第三层:学习过了设计模式,发现自己已经在使用设计模式了,并且发现了一些新的模式挺好用。第四层:阅读了很多别人的源码和框架,在其中看到别人使用了设计模式,并且能够领会设计模式的精妙和带来的好处。第五层:代码写着写着,自己都没意识到使用了设计模式,并且熟练的写了出来。设计模式的介绍设计模式是程序员在面对同类软件工程设计问题 所总结出来的有用的原创 2021-09-10 10:24:11 · 72 阅读 · 0 评论 -
UML类图介绍
UML基本介绍UML(Unified modeling language)统一建模语言,是一种用于软件系统分析和设计的语言工具。它用于帮助软件开放人员进行思考和记录思路的结果。UML本身是一套符号规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和她们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等。Idea中,可以使用 PlantUML 插件画UML图形。UML 关系1. 依赖关系依赖关系是一种使用关系,表示某个类依赖于另一个类通常表现为,某个类的方法参数使用了原创 2021-09-09 16:43:03 · 138 阅读 · 0 评论 -
设计模式遵循的原则
设计模式的目的编写软件过程中,程序员面临来自耦合性、内聚性以及可维护性、可扩展性、重用性、灵活性等多方面的挑战,设计模式是为了让程序具有更好的代码重用性可读性可扩展性可靠性使程序呈现高内聚、低耦合的特性设计模式的七大原则1. 单一职责原则基本介绍对类来说,即一个类应该只负责一项职责,比如类A负责两个不同的职责:职责1和职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2两个类。案例代码违法单一职责原则的代码public class S原创 2021-09-09 13:50:44 · 154 阅读 · 0 评论