设计模式-状态模式
状态模式问题1234请编写程序完成APP抽奖活动具体要求如下:1.假如每参加一次这个活动要扣除用户50积分,中奖概率是10%2.奖品教量固定,抽完就不能抽奖3)活动有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完
基本介绍
状态模式(State Pattern) :它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。
当一个对象的丙在状态改变时,允许改变其行为,这个对象看起来像是改变了其类
环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。
解决问题
状态接口
1234567891011public interface State { //扣除积分 public void deduceMoney(); //是否 ...
设计模式-解释器模式
解释器模式问题123通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求1.先输入表达式的形式,比如atb+c-d+e要求表达式的字母不能重复2.在分别输人a ,b, c, d,e的值t
传统方案解决四则运算问题
编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果
问题分析:如果加入新的运算符,比如*、/、(等等,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰.
解决方案:可以考虑使用解释器模式,即:表达式→解释器(可以有多种)→结果
基本介绍
在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器
解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
应用场景
应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
一些重复出现的问题可以用一种简单的语言来表达
一个简单语法需要解释的场景
这样 ...
设计模式-备忘录模式
备忘录模式问题12游戏角色状态恢复问题游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力枝防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态
利用传统方式解决
一个对象,就对应一个保存对象状态的对象,这样当我们游戏的对象很多时,不利手管理,开销也很大.
传统的方式是简单地做备份,new出另外一个对象出来,再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节
基本介绍
备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作
备忘录模式属于行为型模式
Memento 包含了要被恢复的对象的状态。
Originator 创建并在 Memento 对象中存储状 ...
设计模式-中介者模式
中介者模式问题123智能家庭项目:1.智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘等2.主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放
当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂
各个电器对象彼此联系,你中有我,我中有你,不利于松耦合.
各个电器对象之间所传递的消息(参数),容易混乱
当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想→考虑中介者模式
基本介绍
中介者模式(Mediator Pattern) ,[用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
中介者模式属于行为型模式,使代码易于维护
比如MVC模式,c (Controller控制器)是M(Model模型)和v (view视图〉的中介者,在前后端交互时起到了中间人的作用
Mediator是抽象中介者,定义了同事对象到中介者对象的接口;
Colleague是抽象同事类;
C ...
设计模式-观察者模式
观察者模式问题1234气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。而要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口浏量数据更新时,要能实时的通知给第三方
基本原理观察者模式类似订牛奶业务1
奶站/气象局:Subject
用户/第三方网站:Observer
Subject:登记注册、移除和通知
抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
解决问题
接口,主题
12345pu ...
设计模式-迭代器模式
迭代器模式基本介绍
迭代器模式( lterator Pattern)是常用的设计模式,属于行为型模式
如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。
迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。
抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。一个统一的聚合接口,将客户端和具体聚合解耦。
具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的 ...
设计模式-访问者模式
访问者模式案例12年底,CEO和CTO开始评定员工一年的工作绩效,员工分为工程师和经理,CTO关注工程师的代码量、经理的新产品数量;CEO关注的是工程师的KPI和经理的KPI以及新产品数量。由于CEO和CTO对于不同员工的关注点是不一样的,这就需要对不同员工类型进行不同的处理。
传统方式设计一个Man和Woman类,在类中判断是成功还是失败。
问题:
如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则
扩展性不好,比如增加了新的人员类型,或者管理方法,都不好做
基本介绍
访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题
访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口
访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作”污染”这些对象的类,可以选用访问者模式解决
角色
visit ...
设计模式-命令模式
命令模式案例123451.我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。2.这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电。3.要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这时就可以考虑使用命令模式。4.命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来.5.在我们的例子中,动作的请求者是手机app,动作的执行者是每个厂商的一个家电产品
基本介绍命令模式( command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个.我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计
命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不向的请求(即命名),同时命令模式也支持可撤销的操作。
通俗易懂的 ...
设计模式-模板模式
模板模式案例1234编写制作豆浆的程序,说明如下:1)制作豆浆的流程选材--->添加配料--->浸泡--->放到豆浆机打碎2)通过添加不同的配料,可以制作出不同口味的豆浆3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
基本介绍
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
这种类型的设计模式属于行为型模式。
角色
AbstractClass抽象类,类中实现了模板方法,定义了算法的骨架,具体子类需要去实现其它的抽象方法
ConcreteClass 实现抽象方法,以完成算法中子类的步骤
解决问题制作模板,实现共有的方法,把特定方法放到子类实现
123456789101112131415161718192021222324 ...
设计模式-享元模式
享元模式案例1234小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同1)有客户要求以新闻的形式发布2)有客户人要求以博客的形式发布3)有客户希望以微信公众号的形式发布
传统方式的解决方法直接复制粘贴一份,然后根据客户不同要求,进行定制修改给每个网站租用一个空间
问题
需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费
解决思路:整合到一个网站中,共享其相关的代码和数据,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享,减少服务器资源
对于代码来说,由于是一份实例,维护和扩展都更加容易
上面的解决思路就可以使用享元模式来解决
基本介绍
享元模式( Flyweight Pattern)也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象
常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个
享元模式能够解决重复对 ...