![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
秃然变可爱的小猫咪
这个作者很懒,什么都没留下…
展开
-
第二十五章:责任链模式
1、OA 系统采购审批需求 学校 OA 系统的采购审批项目: 需求是采购员采购教学器材 如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000) 如果金额 小于等于 10000, 由院长审批 (5000<x<=10000) 如果金额 小于等于 30000,由副校长审批 (10000<x<=30000) 如果金额 超过 30000 以上,由校长审批 ( 30000<x) 请设计程序完成采购审批项目 2、传统方案解决 OA 系统审批 类图 传统方式是: 接原创 2020-12-09 12:25:54 · 82 阅读 · 0 评论 -
第二十四章:策略模式
1、编写鸭子项目 编写鸭子项目,具体要求如下: 有各种鸭子(比如野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如叫、飞行等) 显示鸭子的信息 2、传统方案解决鸭子问题 传统方案解决方案 类图 代码实现 Duck:鸭子的抽象父类 public abstract class Duck { public Duck() { } public abstract void display();// 显示鸭子信息 public void quack() { System.out.println("鸭子嘎原创 2020-12-09 12:10:05 · 85 阅读 · 0 评论 -
第二十三章:状态设计模式
1、APP 抽奖活动问题 请编写程序完成APP抽奖活动,具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完 活动的四个状态转换关系图 2、状态模式基本介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类 3、状态模式原理类原创 2020-12-09 11:51:31 · 74 阅读 · 0 评论 -
第二十二章:解释器模式
1、四则运算问题 通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求 先输入表达式的形式,比如 a+b+c-d+e,要求表达式的字母不能重复 在分别输入 a, b, c, d, e 的值 最后求出结果:如图 2、传统方案解决四则运算问题分析 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果 问题分析:如果加入新的运算符,比如 ‘*’、’/’ ( 等等,不利于扩展, 另外让一个方法来解析会造成程序结构混乱,不够清晰 解决方案:可以考虑使用解释器模式, 即: 表达式 --&g原创 2020-12-09 11:40:57 · 178 阅读 · 0 评论 -
第二十一章:备忘录模式
1、游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力), 当大战Boss后攻击力和防御力下降, 然后从备忘录对象恢复到大战前的状态 2、传统方案解决游戏角色恢复 传统的方式的问题分析 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管理,开销也很大 传统的方式是简单地做备份, new 出另外一个对象出来,再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节 解决方案: ==> 备忘录模式 3、备忘录模式基本介绍 备原创 2020-12-09 11:00:47 · 62 阅读 · 0 评论 -
第二十章:中介者模式
1、智能家庭项目 智能家庭项目: 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为: 闹铃响起 --> 咖啡机开始做咖啡 --> 窗帘自动落下 --> 电视机开始播放 2、传统方案解决智能家庭管理问题 类图 传统的方式的问题分析 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂 各个电器对象彼此联系, 你中有我,我中有你,不利于松耦合 各个电器对象之间所传递的消息(参数),容易混乱 当系统增加一个新原创 2020-12-09 10:44:52 · 71 阅读 · 0 评论 -
第十九章:观察者模式
1、天气预报项目需求 天气预报项目需求,具体要求如下: 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压和湿度的接口 测量数据更新时,要能实时的通知给第三方 2、传统方式解决天气预报需求 WeatherData类 通过对气象站项目的分析,我们可以初步设计出一个WeatherData类 通过getXxx()方法,可以让第三方接入,并得到相关信息 当数据有更新时,气象站通过调用dataCh原创 2020-12-09 10:21:07 · 84 阅读 · 0 评论 -
第十八章:迭代器模式
1、学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。 如图: 2、传统方案解决学校院系展示需求 传统的方式的问题分析 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 : 在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的遍历的操作 假如计算机学院的院系存储在数组中,信息工程学院的院系存储在集合中,我们要怎么才能定义一原创 2020-12-09 00:19:07 · 78 阅读 · 0 评论 -
第十七章:访问者模式
1、测评系统的需求 完成测评系统需求 将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同的种类,比如成功、失败等) 2、传统方式完成测评系统 传统方式的问题分析 如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则, 不利于维护 传统方式的扩展性不好,比如增加了新的人员类型,或者管理方法,都不好扩展 引出我们会使用新的设计模式 –-> 访问者模式 3、访问者模式基本介绍 访问者模式(Visitor Pa原创 2020-12-08 23:05:21 · 133 阅读 · 0 评论 -
第十六章:命令设计模式
1、智能生活项目需求 我们买了一套智能家电, 有照明灯、 风扇、 冰箱、 洗衣机, 我们只要在手机上安装 app 就可以控制对这些家电工作。 这些智能家电来自不同的厂家, 我们不想针对每一种家电都安装一个 App, 分别控制, 我们希望只要一个 app 就可以控制全部智能家电。 要实现一个 app 控制所有智能家电的需要, 则每个智能家电厂家都要提供一个统一的接口给 app 调用, 这时 就可以考虑使用命令模式。 命令模式可将“动作的请求者”从“动作的执行者” 对象中解耦出来。 在我们的例子中,动作的请求原创 2020-12-08 22:29:33 · 78 阅读 · 0 评论 -
第十五章:模板方法模式
1、豆浆制作问题 编写制作豆浆的程序, 说明如下: 制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎 通过添加不同的配料, 可以制作出不同口味的豆浆 选材、 浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 请使用模板方法模式完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案, 因此就直接使用,不再使用传统的方案来引出模板方法模式) 2、模板方法模式基本介绍 模板方法模式(Template Method Pattern) , 又叫模板模式(Templ原创 2020-12-08 21:41:38 · 145 阅读 · 0 评论 -
第十四章:代理设计模式
1、代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。 即通过代理对象访问目标对象。 代理对象的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、 创建开销大的对象或需要安全控制的对象 代理模式有不同的形式,主要有三种:静态代理、 动态代理 (JDK代理、接口代理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 2、静态代码模式 静态代码模式的基本介绍 静态代理在使用原创 2020-12-08 21:11:54 · 75 阅读 · 0 评论 -
第十三章:享元设计模式
1、展示网站项目需求 小型的外包项目,给客户A做一个产品展示网站, 客户A的朋友感觉效果不错,也希望做这样产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 2、传统方案解决网站展现项目 方案描述 直接复制粘贴一份,然后根据客户不同要求,进行定制修改 给每个网站租用一个空间 方案设计示意图 问题分析:传统方案解决网站展现项目 需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对原创 2020-12-08 16:13:04 · 81 阅读 · 0 评论 -
第十二章:外观模式
1、影院管理项目 组建一个家庭影院:DVD 播放器、 投影仪、 自动屏幕、 环绕立体声、 爆米花机,要求完成使用家庭影院的功能, 其过程为:直接用遥控器统筹各设备开关 开爆米花机 放下屏幕 开投影仪 开音响 开 DVD, 选 DVD 去拿爆米花 调暗灯光 播放 观影结束后, 关闭各种设备 2、传统方式解决影院管理 传统方式解决影院管理问题分析 在 ClientTest 的main方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程 不利于在Client原创 2020-12-08 15:13:21 · 92 阅读 · 0 评论 -
第十一章:组合设计模式
1、学校院系展示需求 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。 如图: 2、传统方案解决学校院系展示 传统方案解决学校院系展示(类图) 传统方案解决学校院系展示存在的问题分析 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此继承这种方案,不能很好实现的管理的操作,比如对原创 2020-12-08 14:24:19 · 74 阅读 · 0 评论 -
第十章:装饰者模式
1、星巴克咖啡订单项目 星巴克咖啡订单项目(咖啡馆) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、 ShortBlack、 LongBlack(美式咖啡)、 Decaf(无因咖啡) 调料: Milk、 Soy(豆浆)、 Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 使用OO的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡 + 调料组合 方案1:解决星巴克咖啡订单问题分析 Drink 是一个抽象父类,表示饮料 des 就是对咖啡的描述,比如咖啡原创 2020-12-08 13:40:39 · 188 阅读 · 0 评论 -
第九章:桥接模式
1、手机操作问题 现在对不同手机类型、不同品牌的手机实现操作编程(比如:开机、关机、上网,打电话等) 2、传统方案解决手机问题 类图 传统方案解决手机操作问题分析 扩展性问题(类爆炸), 如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本 解决方案 --> 使用桥接模式 3、桥接模式基本介绍 桥接模式(Bridge)-基本介绍 桥接模原创 2020-12-08 00:14:40 · 99 阅读 · 0 评论 -
第八章:适配器模式
1、适配器模式基本介绍 现实生活中的适配器例子 泰国旅游使用插座问题:泰国插座用的是两孔的(欧标) ,可以买个多功能转换插头 (适配器) ,这样就可以使用了 适配器模式基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。 适配器的别名为包装器(Wrapper),适配器模式属于结构型模式 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式 2、适配器模式工作原理 适配器模式:原创 2020-12-07 22:49:47 · 133 阅读 · 0 评论 -
第七章:建造者模式
1、盖房项目实际需求 需要建房子:这一过程为打桩、 砌墙、封顶 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是各自实现的细节不同 请编写程序,完成需求 2、传统方式解决盖房问题 类图 代码实现 1.AbstractHouse:房子的抽象父类,指定建造房子的规范,以及建造房子的具体流程 public abstract class AbstractHouse { // 打地基 public abstract void buildBasic(); // 砌墙 public a原创 2020-12-07 21:49:27 · 135 阅读 · 0 评论 -
第六章:原型模式
1.克隆羊的问题 克隆羊问题的描述 现在有一只羊tom, 姓名为: tom,年龄为: 1, 颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊 传统模式解决克隆羊问题 类图 代码实现: 1.Sheep:羊的实体类 public class Sheep { private String name; private int age; private String color; 2.Client:客户端,发出克隆羊的指令 public class Client { public sta原创 2020-12-07 19:33:06 · 195 阅读 · 0 评论 -
第五章:工厂模式
1.简单工厂模式 简单工厂模式的实际需求 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 1.披萨的种类很多(比如 GreekPizz、CheesePizz 等) 2.披萨的制作有 prepare、bake、cut、box 3.完成披萨店订购功能 传统方式的代码实现 类图设计 代码实现 Pizza 抽象父类 //将Pizza 类做成抽象 public abstract class Pizza { protected String name; //名字 public void setName原创 2020-11-09 23:21:32 · 743 阅读 · 2 评论 -
第四章:单例设计模式
1.单例设计模式介绍 1.所谓类的单例设计模式, 就是采取一定的方法保证在整个的软件系统中, 对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 2.比如 Hibernate 的 SessionFactory, 它充当数据存储源的代理, 并负责创建 Session 对象。SessionFactory 并不是轻量级的, 一般情况下, 一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。 2.单例设计模式八种方式 单例模式有八种方式: 饿汉式(静原创 2020-11-09 20:13:21 · 103 阅读 · 0 评论 -
第三章:设计模式的概述
1.设计模式的层次 1.第 1 层: 刚开始学编程不久, 听说过什么是设计模式 2.第 2 层: 有很长时间的编程经验, 自己写了很多代码, 其中用到了设计模式, 但是自己却不知道 3.第 3 层: 学习过了设计模式, 发现自己已经在使用了, 并且发现了一些新的模式挺好用的 4.第 4 层: 阅读了很多别人写的源码和框架, 在其中看到别人设计模式, 并且能够领会设计模式的精妙和带来的好处。 5.第 5 层: 代码写着写着, 自己都没有意识到使用了设计模式, 并且熟练的写了出来。 2、设计模式介绍 设计模式是原创 2020-11-09 19:00:51 · 136 阅读 · 1 评论 -
第二章:UML类图
1.插件下载 1、安装 UML 插件 Eclipse安装AmaterasUML 参考资料:https://blog.csdn.net/lsh1358046425/article/details/80068644 安装GEF插件 先到 [Eclipse 官网]:https://projects.eclipse.org/projects/tools.gef/downloads上找到AmaterasUML [插件的下载地址]http://download.eclipse.org/tools/gef/updates原创 2020-11-09 17:57:57 · 130 阅读 · 0 评论 -
第一章 设计模式的七大原则
1.设计模式 普遍存在的问题,在项目中反复出现的,所提出的解决方案。 1、设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战, 设计模式是为了让程序(软件),具有如下更好的特性 代码重用性 (即:相同功能的代码,不用多次编写) 可读性 (即:编程规范性,便于其他程序员的阅读和理解) 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响) 使程序呈现高内聚, 低耦合的特性原创 2020-11-06 22:19:12 · 167 阅读 · 0 评论