Java设计模式Ⅶ

  • 1.备忘录模式
    • 1.1 备忘录模式概述
    • 1.2 代码理解
  • 2.解释器模式
    • 2.1 解释器模式概述
  • 3.状态模式
    • 3.1 状态模式概述
    • 3.2 代码理解
  • 4.策略模式
    • 4.1 策略模式概述
    • 4.2 代码理解
  • 5.职责链模式
    • 5.1 职责链模式概述
    • 5.2 代码理解

1.备忘录模式

1.1 备忘录模式概述

(1)基本介绍

①备忘录(Memento)模式在不破坏封装性的前提下,捕获一个对象的内部状态。并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态②理解备忘录模式:    现实中的备忘录是要用来去记录某些要去做的事情,或者是记录已经达成共同意见的事情,以防忘记。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要回退时,可以从备忘录对象里获取原来的数据进行恢复操作,③备忘录模式属于行为型模式

(2)代码类图

Originator:对象(需要保存状态的对象)
Memento:备忘录对象,负责保存好记录,即originator内部状态
Caretaker:守护者对象,负责保存多个备忘录对象,使用集合管理,提高效率

1.2 代码理解

1.Memento

package com.pattern.设计模式.备忘录模式;public class Memento {private String state;public Memento() {}public Memento(String state) {this.state = state;}@Overridepublic String toString() {return "Memento{" +"state='" + state + '\'' +'}';}public String getState() {return state;}public void setState(String state) {this.state = state;}
}

2.Caretaker

package com.pattern.设计模式.备忘录模式;import java.util.ArrayList;
import java.util.List;public class Caretaker {private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento memento) {mementoList.add(memento);}// 获取到第index个Originator的备忘录对象public Memento get(int index) {return mementoList.get(index);}
}

3.Originator

package com.pattern.设计模式.备忘录模式;public class Originator {private String state;// 编写一个方法,可以保存一个状态对象 Mementopublic Memento saveStateMemento() {return new Memento(state);}// 通过备忘录对象,恢复状态public void getStateMemento(Memento memento) {state = memento.getState();}public Originator() {}public Originator(String state) {this.state = state;}public String getState() {return state;}public void setState(String state) {this.state = state;}@Overridepublic String toString() {return "Originator{" +"state='" + state + '\'' +'}';}
}

4.Test

package com.pattern.设计模式.备忘录模式;public class Test {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("状态ok");// 保存了当前的状态caretaker.add(originator.saveStateMemento());originator.setState("状态No");caretaker.add(originator.saveStateMemento());originator.setState("状态还行");caretaker.add(originator.saveStateMemento());System.out.println("当前状态:" + originator.getState());// 希望恢复到状态okoriginator.getStateMemento(caretaker.get(0));System.out.println("当前状态:" + originator.getState());}
}

2.解释器模式

2.1 解释器模式概述

(1)基本介绍

①在编译原理中, 一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器②解释器(Interpreter)模式:是指给定一个语言(表达式), 定义它的文法的一种表示,并定义一个解释器, 使用该解释器来解释语言中的句子

(2)原理类图

Context: 是环境角色,含有解释器之外的全局信息.
AbstractExpression: 抽象表达式, 声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享
?TerminalExpression: 为终结符表达式, 实现与文法中的终结符相关的解释操作
NonTermialExpression: 为非终结符表达式,为文法中的非终结符实现解释操作.

(3)代码类图

PS:Spring框架中SpelExpressionParser就用到了解释器模式

3.状态模式

3.1 状态模式概述

(1)基本介绍

①状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换②当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类

(2)原理类图

Context 类为环境角色, 用于维护State实例,这个实例定义当前状态
State 是抽象状态角色,定义一个接口封装与Context 的一个特点接口相关行为
ConcreteState 具体的状态角色,每个子类实现一个与Context 的一个状态相关行为

(3)代码类图

3.2 代码理解

1.State

package com.pattern.设计模式.状态模式;public abstract class State {// 扣除积分的方法public abstract void Subtract();// 是否中奖public abstract boolean getPrize();// 发放奖品public abstract void grantPrize();
}

2.NoRaffleState

package com.pattern.设计模式.状态模式;public class NoRaffleState extends State{// 初始化拆传入活动引用 扣除积分后参加活动RaffleActivity raffleState;public NoRaffleState(RaffleActivity raffleState) {this.raffleState = raffleState;}// 当前状态可以扣积分 扣除后将状态改为可以抽奖状态@Overridepublic void Subtract() {System.out.println("扣除50积分成功,你可以进行抽奖活动了");raffleState.setState(raffleState.getCanRaffleState());}// 当前状态不能抽奖@Overridepublic boolean getPrize() {System.out.println("扣除了积分才能抽奖");return false;}// 当前状态不能发放奖品@Overridepublic void grantPrize() {System.out.println("不能发放奖励");}
}

3.DispenseState

package com.pattern.设计模式.状态模式;public class DispenseState extends State{RaffleActivity raffleState;public DispenseState(RaffleActivity raffleState) {this.raffleState = raffleState;}@Overridepublic void Subtract() {System.out.println("已经扣除过积分了");}@Overridepublic boolean getPrize() {System.out.println("不能抽奖");return false;}@Overridepublic void grantPrize() {if (raffleState.getCount() > 0){System.out.println("恭喜你,中奖了!!!");// 改变状态为不能抽奖raffleState.setState(raffleState.getNoRaffleState());} else {System.out.println("很遗憾!!!奖品已经发放完毕!");// 改变状态为奖品发送完毕raffleState.setState(raffleState.getDispenseOutState());}}
}

4.DispenseOutState

package com.pattern.设计模式.状态模式;public class DispenseOutState extends State{RaffleActivity raffleState;public DispenseOutState(RaffleActivity raffleState) {this.raffleState = raffleState;}@Overridepublic void Subtract() {System.out.println("奖品发放完了,请下次再来参加");}@Overridepublic boolean getPrize() {System.out.println("奖品发放完了,请下次再来参加");return false;}@Overridepublic void grantPrize() {System.out.println("奖品发放完了,请下次再来参加");}
}

5.CanRaffleState

package com.pattern.设计模式.状态模式;import java.util.Random;public class CanRaffleState extends State{RaffleActivity raffleState;public CanRaffleState(RaffleActivity raffleState) {this.raffleState = raffleState;}@Overridepublic void Subtract() {System.out.println("已经扣除积分了");}@Overridepublic boolean getPrize() {System.out.println("正在抽奖");Random random = new Random();int num = random.nextInt(10);// 10%的几率中将if (num == 0) {// 改变活动状态为发放奖品raffleState.setState(raffleState.getDispensePrize());return true;} else {System.out.println("很遗憾,你没有中奖");// 改变状态为不能中奖raffleState.setState(raffleState.getNoRaffleState());return false;}}@Overridepublic void grantPrize() {System.out.println("没中奖,不能发放奖品");}
}

6.RaffleActivity

package com.pattern.设计模式.状态模式;public class RaffleActivity {// 表示当前状态State state = null;// 奖品数量int count = 0;// 四个属性表示四种状态State noRaffleState = new NoRaffleState(this);State canRaffleState = new CanRaffleState(this);State dispensePrize = new DispenseState(this);State dispenseOutState = new DispenseOutState(this);// 构造器 会初始化一个当前的状态public RaffleActivity(int count) {this.state = getNoRaffleState();this.count = count;}// 扣除积分public void Subtract() {state.Subtract();}// 抽奖public void getPrize() {if (state.getPrize()) {state.grantPrize();}}public State getState() {return state;}public void setState(State state) {this.state = state;}public int getCount() {int curCount = count;count--;return curCount;}public void setCount(int count) {this.count = count;}public State getNoRaffleState() {return noRaffleState;}public void setNoRaffleState(State noRaffleState) {this.noRaffleState = noRaffleState;}public State getCanRaffleState() {return canRaffleState;}public void setCanRaffleState(State canRaffleState) {this.canRaffleState = canRaffleState;}public State getDispensePrize() {return dispensePrize;}public void setDispensePrize(State dispensePrize) {this.dispensePrize = dispensePrize;}public State getDispenseOutState() {return dispenseOutState;}public void setDispenseOutState(State dispenseOutState) {this.dispenseOutState = dispenseOutState;}}

7.Test

package com.pattern.设计模式.状态模式;public class Test {public static void main(String[] args) {RaffleActivity raffleActivity = new RaffleActivity(2);for (int i = 0; i < 100; i++) {System.out.println("" + (i + 1) + "");raffleActivity.Subtract();raffleActivity.getPrize();}}
}

4.策略模式

4.1 策略模式概述

(1)基本介绍

①策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户②这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

(2)原理类图

从上图可以看到,客户context 有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定.

(3)代码类图

PS:JDK的Arrays的Comparator使用到了策略模式

4.2 代码理解

1.InterfaceFly

package com.pattern.设计模式.策略模式;public interface InterfaceFly {void fly();
}

2.NoFly

package com.pattern.设计模式.策略模式;public class NoFly implements InterfaceFly{@Overridepublic void fly() {System.out.println("垃圾鸭!不会飞翔");}
}

3.ToysFly

package com.pattern.设计模式.策略模式;public class ToysFly implements InterfaceFly{@Overridepublic void fly() {System.out.println("玩具鸭飞不起来");}
}

4.GoodFly

package com.pattern.设计模式.策略模式;public class GoodFly implements InterfaceFly{@Overridepublic void fly() {System.out.println("这是good鸭,特别会飞");}
}

5.Duck

package com.pattern.设计模式.策略模式;public abstract class Duck {InterfaceFly interfaceFly;public Duck() {}public Duck(InterfaceFly interfaceFly) {this.interfaceFly = interfaceFly;}public abstract void disPlay(); // 鸭子属性public void quack() {System.out.println("嘎嘎嘎的叫");}public void swim() {System.out.println("会游泳!!!");}public void fly() {if (interfaceFly != null) {interfaceFly.fly();}}
}

6.WildDuck

package com.pattern.设计模式.策略模式;public class WildDuck extends Duck{public WildDuck() {interfaceFly = new GoodFly();}@Overridepublic void disPlay() {System.out.println("这是野鸭");}
}

7.ToysDuck

package com.pattern.设计模式.策略模式;public class ToysDuck extends Duck{public ToysDuck() {interfaceFly = new NoFly();}@Overridepublic void disPlay() {System.out.println("这是玩具鸭");}}

8.OrdinaryDuck

package com.pattern.设计模式.策略模式;public class OrdinaryDuck extends Duck{public OrdinaryDuck() {interfaceFly = new NoFly();}@Overridepublic void disPlay() {System.out.println("这是普通鸭");}}

9.Test

package com.pattern.设计模式.策略模式;public class Test {public static void main(String[] args) {WildDuck wildDuck = new WildDuck();wildDuck.fly();OrdinaryDuck ordinaryDuck = new OrdinaryDuck();ordinaryDuck.fly();ToysDuck toysDuck = new ToysDuck();toysDuck.fly();}
}

5.职责链模式

5.1 职责链模式概述

(1)基本介绍

①职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,为请求创建了一个接收者对象的链(简单示意 图)。这种模式对请求的发送者和接收者进行解耦。②职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的 请求传给下一个接收者,依此类推。③它属于行为型模式

(2)原理类图

Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外 Handler
ConcreteHandlerA , B: 是具体的处理者, 处理它自己负责的请求, 可以
问它的后继者(即下一个处理者), 如果 可以处理当前请求,则处理,否则
将该请求交个 后继者去处理,从而形成一个职责链
Request : 含义很多属性,表示一个请求

(3)代码类图

PS:职责链模式在SpringMVC框架的HandlerExcutionChain类 中用到了

5.2 代码理解

package com.pattern.设计模式.职责链模式;public abstract class AppRover {AppRover appRover; // 下一个处理者String name;// 处理审批请求public abstract void processRequest(PurchaseRequest purchaseRequest);public AppRover(String name) {this.name = name;}public AppRover getAppRover() {return appRover;}public void setAppRover(AppRover appRover) {this.appRover = appRover;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "AppRover{" +"appRover=" + appRover +", name='" + name + '\'' +'}';}}
package com.pattern.设计模式.职责链模式;public class DepartmentAppRover extends AppRover {public DepartmentAppRover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() <= 5000) {System.out.println(purchaseRequest.getId() + "号被" + this.name + "处理了");} else {appRover.processRequest(purchaseRequest);}}
}
package com.pattern.设计模式.职责链模式;public class College extends AppRover {public College(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 10000) {System.out.println(purchaseRequest.getId() + "被" + this.name + "处理了");} else {appRover.processRequest(purchaseRequest);}}
}
package com.pattern.设计模式.职责链模式;public class SchoolOne extends AppRover {public SchoolOne(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 30000) {System.out.println(purchaseRequest.getId() + "被" + this.name + "处理了");} else {appRover.processRequest(purchaseRequest);}}
}
package com.pattern.设计模式.职责链模式;public class ViceSchool extends AppRover{public ViceSchool(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000) {System.out.println(purchaseRequest.getId() + "被" + this.name + "处理了");} else {appRover.processRequest(purchaseRequest);}}
}
package com.pattern.设计模式.职责链模式;public class PurchaseRequest {private int type = 0;private float price = 0.0f;private int id = 0;public PurchaseRequest(int type, float price, int id) {this.type = type;this.price = price;this.id = id;}public int getType() {return type;}public void setType(int type) {this.type = type;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "PurchaseRequest{" +"type=" + type +", price=" + price +", id=" + id +'}';}
}

7.Test

package com.pattern.设计模式.职责链模式;public class Test {public static void main(String[] args) {PurchaseRequest purchaseRequest = new PurchaseRequest(1, 3000, 1);// 创建相关的审批人DepartmentAppRover departmentAppRover = new DepartmentAppRover("李主任");College college = new College("王院长");ViceSchool viceSchool = new ViceSchool("张副校");SchoolOne schoolOne = new SchoolOne("刘校长");// 将审批的下一个责任人set好(处理人形成一个环形)departmentAppRover.setAppRover(college);college.setAppRover(viceSchool);viceSchool.setAppRover(schoolOne);// 最大再把权利交给最小schoolOne.setAppRover(departmentAppRover);departmentAppRover.processRequest(purchaseRequest);}
}

PS:到这里就结束了23种设计模式,这些个文章主要用于自己做个简单的笔记,当然也希望能帮到需要的人,23个模式的的总笔记可以下载我的资源,我上传了一个笔记资源。也希望大家可以之处问题。谢谢大家!!!

Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)相关推荐

  1. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)

    概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...

  2. java 职责链模式_java设计模式-职责链模式

    模式导读: 作为一名大学生,相信我们都有过请假的经历,在我们请假是总会碰到这样的场景,就是当请假的时间超过5天(包括5天),我们的请假条就不能由班主任进行审阅通过了,而是需要上交院系,由院领导进行审阅 ...

  3. 观察者模式与职责链模式的相同和不同_GOF设计模式(策略模式,职责链模式)...

    策略模式(整体的替换算法) 基本介绍:对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法.(定义一组算法,将每个算法都封装起来,并且使他们之间可以互换).多用于封装算法 类图 角色: 上下文 ...

  4. 设计模式-责任链(职责链)模式及责任链设计模式的应用

    1.什么是责任链设计模式 责任链设计模式主要构成有抽象处理者.具体处理者.客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样所有处理对象都有机会处理请求,使发送者与接受者解耦 在责任链模 ...

  5. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例 ...

  6. 15、设计模式-行为型模式-职责链模式

    职责链模式 很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,例如SCM系统中的采购 单审批,主任.副董事长.董事长和董事会都可以处理采购单,他们可以构成一条处理采购 单的链式结构,采购单沿 ...

  7. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  8. 设计模式---职责链模式(Chain of Responsibility Pattern)

    目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...

  9. 王争 | 设计模式之美 - 职责链模式

    文章目录 1. 职责链模式的定义 2. 职责链模式的代码实现方式1 1. 处理器抽象类 Handler 2. 具体处理器 HandlerA 和 HandlerB 3. 处理器链 HandlerChai ...

最新文章

  1. 秒懂QPS、TPS、PV、UV、GMV、IP、RPS!
  2. 如何用Curl 来post xml 数据
  3. enterText与typeText
  4. Maven本地库在哪?
  5. 三角函数公式、诱导公式
  6. hashcat离线碰撞md5
  7. 【LeetCode - 122】买卖股票的最佳时机 II(贪心 或 dp)
  8. C++/C中 sizeof(指针)和sizeof(数组名)的区别
  9. 关于“Exchange Server 地址列表服务未能响应”的错误解决方法。
  10. 即时通讯安全问题大曝光
  11. 简单的Net::FTP模块的简单应用
  12. 动态规划--凑硬币问题
  13. C++ {}作用域 return
  14. 【素材分享】冒险岛 枫叶素材(AI矢量文件+ASS绘图代码+PNG图片)
  15. 判断单链表是否中心对称算法
  16. 一个页面中使用多个iframe导致在ie中假死问题的解决方法
  17. msgbox.html5.qq.com,怎样制作qq透明背景皮肤
  18. 盗版WIN7的管理员权限
  19. flutter HEX 色值,转换成RGBO 格式
  20. 500台以上的大型网吧设计解决方案(转)

热门文章

  1. lxml xpath 爬取并正常显示中文内容
  2. java selenium (十四) 处理Iframe 中的元素
  3. C#正则表达式获取组名,按照组名输出匹配内容
  4. jsp/servlet与ajax实现简单局部日期时间更新
  5. 深度剖析http协议(一)
  6. Linux设置程序开机启动-tomcat开机启动
  7. spring-mvc注解
  8. Hybrid App 跨平台热更新方案实践 附带源码
  9. json - 使用 json-lib
  10. Oracle 中count(1) 和count(*) 的区别