Java设计模式之行为型-命令模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之行为型-命令模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

4.1、基本实现

4.2、点餐案例 

五、总结


一、基础概念

1、将一个请求封装为一个对象,使您可以用不同的请求对客户进行参数化。

2、对请求排队或记录请求日志,以及支持可撤销的操作。

3、将命令对象与执行命令的对象分离,实现调用者和接收者的解耦。

其中命令对象是关键,它包含了一个接收者和一个执行操作的方法。该命令对象绑定一个接收者对象,并通过调用接收者相应的操作来完成执行请求的功能。

二、UML类图

Java设计模式之行为型-命令模式(UML类图+案例分析),设计模式,Java,java,设计模式,命令模式,uml

三、角色设计

角色 描述
抽象命令类 定义命令的接口,声明执行的方法
具体命令角色 具体命令类,实现了命令接口,绑定接收者,并实现执行命令的操作
接收者类 知道如何实施与执行一个请求相关的操作
调用者类 接收命令请求并执行命令
客户端类 创建命令对象并设定它的接收者

四、案例分析

4.1、基本实现

主要包含以下几个部分:

1、Command抽象命令类:定义了命令的公共接口一般是一个execute()方法。

2、ConcreteCommand具体命令角色:实现了Command接口,是具体的命令类,包含对Receiver对象的引用。其execute()方法会调用Receiver的相应方法。

3、Receiver接收者类:命令对象Indirect调用的接收者对象。实现了具体的业务逻辑。

4、Invoker调用者类:请求的调用者。其持有Command对象的引用,并通过command.execute()间接调用Receiver。

5、Client客户端类:创建Command和Receiver对象,并创建Invoker传入Command对象,最后调用Invoker的invoke()方法触发执行。

这个实现让调用者Invoker和接收者Receiver解耦,Invoker只与Command接口发生依赖,不需要知道具体的命令与接收者。

抽象命令类:

public interface Command {
    /**
     * 执行方法
     */
    void execute();
}

 接收者类:

public class Receiver {
    /**
     * 真正执行命令相应的操作
     */
    public void action(){
        System.out.println("执行操作");
    }
}

具体命令角色类:

public class ConcreteCommand implements Command {

    //持有相应的接收者对象
    private Receiver receiver = null;
    /**
     * 构造方法
     */
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        //通常会转调接收者对象的相应方法,让接收者来真正执行功能
        receiver.action();
    }

}

调用者类:

public class Invoker {
    /**
     * 持有命令对象
     */
    private Command command = null;
    /**
     * 构造方法
     */
    public Invoker(Command command){
        this.command = command;
    }
    /**
     * 行动方法
     */
    public void action(){
        command.execute();
    }
}

客户端: 

public class Client {

    public static void main(String[] args) {
        //创建接收者
        Receiver receiver = new Receiver();
        //创建命令对象,设定它的接收者
        Command command = new ConcreteCommand(receiver);
        //创建请求者,把命令对象设置进去
        Invoker invoker = new Invoker(command);
        //执行方法
        invoker.action();
    }

}

运行结果如下:

Java设计模式之行为型-命令模式(UML类图+案例分析),设计模式,Java,java,设计模式,命令模式,uml

4.2、点餐案例 

这个点餐的命令模式案例,主要演示了几个角色对象之间的关系:

1、Waiter是接收者对象,知道如何执行点餐操作。

2、OrderCommand是命令对象,它封装了一个点餐请求,绑定了接收者Waiter。可以调用execute()执行点餐。

3、Customer是调用者对象,它通过命令对象indirect地执行点餐请求。可以设定并触发命令。

4、Client是客户端,进行对象的创建和使用。

抽象命令类:

public interface Command {

    public void execute();

}

服务员(接收者类):

public class Waiter {

    public void takeOrder(String food) {
        System.out.println("服务员:收到点餐,食物是:" + food);
    }

}

点餐命令类(具体的命令类):

public class OrderCommand implements Command {

    private Waiter waiter;
    private String food;

    public OrderCommand(Waiter waiter, String food) {
        this.waiter = waiter;
        this.food = food;
    }

    @Override
    public void execute() {
        waiter.takeOrder(food);
    }

}

顾客(调用者类):

public class Customer {

    private Command command;

    public void setOrder(Command command) {
        this.command = command;
    }

    public void orderUp() {
        command.execute();
    }

}

客户端类: 

public class Client {
    
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        Command cmd = new OrderCommand(waiter, "番茄炒蛋");

        Customer customer = new Customer();
        customer.setOrder(cmd);
        customer.orderUp();
    }
    
}

运行结果如下:

Java设计模式之行为型-命令模式(UML类图+案例分析),设计模式,Java,java,设计模式,命令模式,uml

整个执行流程是:

1、Client创建Waiter、OrderCommand、Customer对象。

2、Client把OrderCommand命令对象设置给Customer调用者。

3、Client请求Customer调用orderUp方法。

4、Customer的orderUp方法内部将调用OrderCommand的execute。

5、OrderCommand的execute会调用其内部绑定的Waiter的takeOrder方法。

6、这样客户的请求就通过命令对象传达给服务员,进行点餐。

这实现了调用者与接收者的解耦,并且使用命令对象可以方便实现撤销、重做、日志等功能。 

五、总结

优点:

1、解耦了命令的发出者和执行者:发出命令的对象只需要知道命令接口,不需要知道具体的命令执行者。

2、可以较容易地设计一个命令队列和宏命令:通过命令队列可以对命令进行排队,而宏命令可以执行一系列的命令。

3、可以较容易实现命令的撤销和重做:通过保存执行过的命令对象,可以方便地实现回退。

缺点:

1、可能产生很多具体的命令类:因为每一个命令都需要一个具体的命令类,所以如果命令种类很多,会导致类的个数增加很多。

2、系统可能要慢一点,因为每次执行命令时,都需要先创建命令对象。

应用场景:

1、需要对操作进行记录、撤销/重做、事务等处理的场景。命令模式可以方便实现这些功能。

2、需要将请求调用者和请求接收者解耦的场景。命令模式可以使两者独立变化。

3、需要把操作封装成对象传递和存储的场景。命令模式可以把操作转换为对象。

4、需要对操作进行排队或记录日志、支持事务等功能的场景。可以用命令队列实现排队,用命令对象记录日志。

5、需要支持向组合系统中添加新命令的场景。命令模式使新增命令比较方便。

6、需要对系统进行状态恢复的场景。可以利用命令对象实现状态恢复。

7、需要实现宏命令、也就是组合命令的场景。命令模式可以方便实现宏命令。 

符合的设计原则:

1、开闭原则(Open-Closed Principle)

命令模式中,命令的执行者与发出者是解耦的,发出者只知道命令接口,具体的实现执行者可以新增而不需要修改发出者。这样就满足了开闭原则。

2、单一职责原则(Single Responsibility Principle)

命令模式把请求的发出者和执行者进行了分离,发出者负责发出命令请求,执行者负责具体执行,职责划分明确,都满足单一职责原则。

3、组合复用原则(Composite Reuse Principle)

命令模式可以方便地将多个命令组合成一个组合命令,满足组合复用原则。

4、里氏替换原则(Liskov Substitution Principle)

命令模式中抽象命令类规定了接口,具体命令类都遵循这个接口,满足里氏替换原则。文章来源地址https://www.toymoban.com/news/detail-559091.html

到了这里,关于Java设计模式之行为型-命令模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之行为型-访问者模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。 访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就

    2024年02月16日
    浏览(54)
  • Java设计模式之创建型-原型模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析  4.1、通用实现(浅克隆) 4.2、深克隆 五、总结 原型模式通过复制已有对象作为原型,通过复制该原型来返回一个新对象,而不是新建对象,说白了就是不断复制相同的对象罢了。 角色 描述 抽象原型类 规定了具

    2024年02月15日
    浏览(48)
  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(44)
  • Java设计模式之创建型-单例模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、饿汉模式 4.2、懒汉模式(线程不安全) 4.3、懒汉模式(线程安全) 4.4、双重检索模式 4.5、静态内部类 4.6、枚举  五、总结 单例模式确保一个类只有一个实例,提供一个全局访问点。一般实现方式是把构造函

    2024年02月13日
    浏览(43)
  • Java设计模式之创建型-建造者模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计  四、案例分析 五、总结 建造者模式是一种创建型设计模式,它使我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂

    2024年02月15日
    浏览(40)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(50)
  • Java设计模式之结构型-享元模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、游戏角色 五、总结 享元模式是一种结构型设计模式,主要用于减少创建大量相似对象所占用的内存,它通过共享技术来有效支持大量细粒度的对象。 角色 描述 抽象享元角色 定义出对象的外部状

    2024年02月16日
    浏览(45)
  • Java设计模式之结构型-装饰器模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二  五、总结  装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。 角色 描述 抽象构件 是一个接口或者抽象类,定义我们最核心的对象 具体构件 抽象构件的实现,

    2024年02月11日
    浏览(35)
  • Java设计模式之UML类图

    UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。对于程序员来说,最频繁使用的莫过于类图。因此,这里我只讲解UML类图。 类图是面向对象系统建模中最常

    2024年02月03日
    浏览(41)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包