软件体系结构之命令模式、策略模式讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

命令模式
命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令 的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的 一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么 被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
= tv; }
public void execute() { //执行请求 tv.on(); } public void undo() { //撤销请求 tv.off(); }
命令模式实例二---外卖程序
应用命令模式(封装调用)来实现模拟外卖的程序。将“请求”封装成对象,以便使用不同 的请求队列或者日志来参数化其他对象。
策略模式的优点
(1).体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要 添加一种策略即可。
(2).避免了使用多重转移语句(if..else if..else)。 (3).提供了可以替换继承关系的办法: 继承提供了另一种支持多种算法或行为的方法 。
策略模式的缺点
(1).每添加一个策略就要增加一个类,当策略过多 是会导致类数目庞大。
5
命令模式
经典的命令模式中的角色:
Command:定义命令的统一接口 ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直 接用来充当Receiver。 Receiver:命令的实际执行者 Invoker:命令的请求者,是命令模式中最重要的角色。这个角色用来对各个命令进行控制。 Client:客户端,创建具体命令对象,并设置命令对象的接收者。
public void comeOn(); }
编码部门DoWorking
class Coding implements DoWorking { public void comeOn() { System.out.println("I'm coding...."); } }
策略模式实例分析-以公司各职能部门为例
首先,让所有的命令对象实现相同的包含execute()方法的接口TakeOut。 当我们需要下外卖订单时,需要根据不同的食物而实现不同的方法,比如在意大利通心 粉Spaghetti和西冷牛排SirloinSteak类中有cook()方法以及deliever()方法,而在Pizza类中需 要实现cook()、cut()、box()、deliever()方法。 顾客负责创建命令对象,并且动作和接受者在命令对象中被绑在一起。 外卖都有制作和派送两个方法,因此又抽象出一层,用Cook类中的setFood()方法实现不 同的菜品,但发现与命令模式训练有冲突,于是选择了加入需要其他操作的Pizza类,以便更 好地理解命令模式。
(2).客户端需明确知道系统有哪些策略可以使用 ,当策略过多时客户端的学习成本较高。
算法体现了几个设计原则: 第一、把变化的代码从不变的代码 中分离出来; 第二、针对接口编程而不是具体类 (定义了策略接口); 第三、多用组合,少用继承(客户 通过组合方式使用策略)。
策略模式实例分析-以公司各职能部门为例
定义的策略接口,就是工作内容 interface DoWorking {
public void comeOn(); }
编码类实现策略接口DoWorking
class Coding implements DoWorking { public void comeOn() { System.out.println("I'm coding...."); } }
策略模式实例分析-以公司各职能部门为例
定义的策略接口,就是工作内容 interface DoWorking {
COMMAND—两个没法见面的同学,借助于第三个同学实现两人之间的信息传递, 甲对乙有什么指示,就写一张纸条让丙带给乙。丙传送过来一个COMMAND,乙向他表 示感谢,哪知道他说:“我同时给三个同学送COMMAND“
命令模式的优点
01. 能够顺序执行 02. 消除耦合 03. 满足“开闭原则” 04. 可以记录日志
策略模式
经典的命令模式中的角色:
Command:定义命令的统一接口 ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直 接用来充当Receiver。 Receiver:命令的实际执行者 Invoker:命令的请求者,是命令模式中最重要的角色。这个角色用来对各个命令进行控制。 Client:客户端,创建具体命令对象,并设置命令对象的接收者。
使用场景 1.如果一个系统里有很多类,他们只是某个行
为不同时,使用策略模式可以让一个对象在许多 行为中选择一种行为。
2.一个系统需要动态地在几种算法中选择一种。 3.有多重转移条件语句考虑使用策略模式。
策略模式的结构
客户context拥有成员变量strategy(策略),至于需要 用到那种策略,可以在构造器中指定
STRATEGY应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
策略模式
if(type == 1){ //微信支付
}else if(type == 2){ // 支付宝支付
}else if(type == 3){ //现金支付
命令模式的适用场景和总结
(1)、当需要一个对象执行某个动作,但并不知道或者无须知道接收者是什么对象时使用。 (2)、当需要连续或者同时控制多个对象执行动作时,可以运用命令模式把每个动作封装成一个命令, 组成命令队列。只要操纵该队列的命令就可以控制多个对象执行相关动作。 (3)、当需要考虑系统恢复时,可以使用命令日志。
System.out.println("灯关闭了"); } }
命令模式实例
package command.pattern; //没有任何命令,用于初始化每个按键,当调用空命 令时,对象什么事情都不做, //有些时候这也是一种设计模式,因为它为我们省去 判空的操作 public class NoCommand implements Command{
命令模式
命令模式实例--以家用电器的控Fra bibliotek为例第一步,创建电灯和电视对象,就是接收者
package command.pattern; //灯对象 public class LightObj {
public void on(){ System.out.println("灯打开了");
} public void off(){
public void execute() {
} public void undo() { } }
package command.pattern;//打开电视命令 public class TVOnCommand implements Command{
TVObj tv; public TVOnCommand(TVObj tv){
策略模式
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中, 从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中 提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
审计部门DoWorking
可以直接生成一个Context类的子类,从而给它以不同
class auditing implements DoWorking {
public void comeOn(){ System.out.println("正在审计财务报
表...."); }
的行为。但这会将行为硬行编制到 Context中,而将算法的 实现与Context的实现混合起来,从而使Context难以理解 、难以维护和难以扩展,而且还不能动态地改变算法。最 后得到一堆相关的类 , 它们之间的唯一差别是它们所使用 的算法或行为。 将算法封装在独立的Strategy类中使得你 可以独立于其Context改变它,使它易于切换、易于理解、 易于扩展。
命令模式允许请求的一方和发送的一方独立开来使得请求的一方不必知道接收请求的一方的接口更不必知道请求是怎么被接收以及操作是否执行何时被执行以及是怎么被执行的
软件设计模式 命令模式 & 策略模式
目录 Contents
1 命令模式 2 策略模式 3 关键技术与实践难点 4 研究成果与应用 5 相关建议与论文总结
1、”请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的,命令对象起到了纽带桥 梁的作用。
2、空命令也可以说是一种设计模式,它为我们省去了判空的操作。
策略模式
经典的命令模式中的角色:
Command:定义命令的统一接口 ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直 接用来充当Receiver。 Receiver:命令的实际执行者 Invoker:命令的请求者,是命令模式中最重要的角色。这个角色用来对各个命令进行控制。 Client:客户端,创建具体命令对象,并设置命令对象的接收者。
相关文档
最新文档