设计模式之行为模式中的命令模式(command)

mac2024-05-17  32

设计模式之行为模式中的命令模式(command)

声明一、行为模式二、命令模式三、实例概况描述代码运行结果优点缺点类似的模式

声明

本人写此文章只是为了梳理知识、更好的学习,基本内容来源于课本《软件架构与模式》,若有错误还请指正,此外会借鉴一些优秀的文章,网址放在文末,若有侵权可告知我删除。

一、行为模式

1、行为模式描述了通过对象间的合作形成的一种关系。 2、行为模式可以区分为基于类的行为模式和基于对象的行为模式。基于类的行为模式通过继承得到所希望的静态行为(如模板方法模式)。基于对象的行为模式可以使用里氏代换原则,在运行时通过提替换对象修改行为(动态修改行为的例子是策略模式)。 3、行为模式研究的是类或对象之间的合作与任务分工,它描述的是对象间的交互。

二、命令模式

命令模式把命令作为对象进行封装,这样可以让一个命令的生成和执行分离。命令可以先生成,然后在以后的某一时刻在执行。所有命令如果放入一个列表中,就可以轻松的实现日志功能或者撤销功能。 调用者不应该依赖于命令的具体表现形式,它应该只识别一个命令的抽象形式,具体命令的细节对于调用者是隐藏的,调用者不应识别命令的接受者。

三、实例

概况描述

灯的开关是调用者,用于施发命令(开关灯的命令),每个命令是一个类,命令类中定义灯的实例,调用灯的方法。开关类调用命令类,命令类调用灯类,这样开关类就与灯类没有实际联系。

代码

命令接口:

interface ICommand { public void execute(); }

灯:具体命令的接受类。

public class Light { public void open() { System.out.println("开灯"); } public void close() { System.out.println("关灯"); } }

开灯命令:

public class LightOpen implements ICommand { private Light light; public LightOpen(Light light) { this.light = light; } public void execute() { light.open(); } }

关灯命令:

public class LightClose implements ICommand { private Light light; public LightClose(Light light) { this.light = light; } public void execute() { light.close(); } }

灯的开关:调用者类。【注意代码,注意private】

public class LightSwitch { private ICommand icom; public void command(ICommand icom) { this.icom = icom; } public void update() { icom.execute(); } }

测试主类:

public class CommandTest { public static void main(String[] args) { LightSwitch LS = new LightSwitch(); Light light = new Light(); ICommand open = new LightOpen(light); ICommand close = new LightClose(light); LS.command(open); LS.update(); LS.command(close); LS.update(); } }

运行结果

开灯 关灯

优点

命令的生成和执行在时间上没有关联。 通过把命令封装在一个命令对象中,引入一个中间层。所以命令和执行可以异步进行。 调用者不需要知道具体命令细节。所以命令可以更换,调用者的实现可以不依赖于系统的其他部分。 可以在运行时动态的更换命令,可以改变调用者的行为。 命令对象可以复用,所以对于一个命令对象指向接受者对象的引用是可以改变的。命令对象可以重新执行,客户不必为每一个接受者都生成一个新的命令对象。

缺点

把命令封装在一个对象中,在调用命令时生成了额外的开销(装箱)。 每一个具体命令都要有一个类相对应。如果要增加命令的参数或者为一个命令编写另外一个接受者类,就会增加系统开销。 此模式用于分布式系统时相当复杂。

类似的模式

策略模式。 活动对象模式是命令模式的扩展。

最新回复(0)