研磨设计模式day12命令模式

这篇具有很好参考价值的文章主要介绍了研磨设计模式day12命令模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

定义

几个参数

场景描述

代码示例

参数化设置

命令模式的优点

本质 

何时选用


定义

研磨设计模式day12命令模式,设计模式,命令模式

几个参数

Command:定义命令的接口。

ConcreteCommand:命令接口的实现对象。但不是真正实现,是通过接收者的功能来完成命令要执行的操作

Receiver:接收者。真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能

Invoker:要求命令对象执行请求,通常持有命令对象。

Client:创建具体的命令对象,并且设置命令对象的接收者。

场景描述

电脑开机:

机箱上的按钮就相当于是命令对象

机箱相当于是Invoker:要求机箱上的按钮执行哪些动作

主板相当于接收者对象:真正执行命令的对象

命令对象持有接收者对象就相当于按钮有一条线连接着主板,当按钮被按下就通过连接线把命令发出去。

代码示例

定义主板

package day12命令模式;

/**
 * 主板的接口
 */
public interface ZhuBanApi {
    /**
     * 定义一个功能:开机
     */
    public void open();
}

定义实现,定义两个一个是技嘉主板,一个是微星主板,现在将实现写为一样

不同的主板对同一个命令的操作可以是不同的

技嘉主板

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

public class JiJiaZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("技嘉主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }
}

微星主板

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

public class WeiXingZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("微星主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }
}

定义命令接口:里面只有一个方法就是执行

package day12命令模式;

/**
 * 命令接口,声明执行的操作
 */
public interface Command {
    /**
     * 执行命令对应的操作
     */
    public void execute();
}

命令实现:我们按下的是按钮,但是按钮本身不知道怎么去启动电脑,只有主板知道,所以我们要持有真正实现命令的接收者--主板对象

package day12命令模式.Impl;

import day12命令模式.Command;
import day12命令模式.ZhuBanApi;

/**
 * 开机命令接口的实现
 */
public class CommandImpl implements Command {
    /**
     * 持有真正实现命令的接收者--主板对象
     */
    private ZhuBanApi zhuBanApi = null;

    /**
     * 构造方法,传入主板对象
     * @param zhuBanApi
     */
    public CommandImpl(ZhuBanApi zhuBanApi){
        this.zhuBanApi = zhuBanApi;
    }

    /**
     * 实现开机
     */
    @Override
    public void execute() {
        this.zhuBanApi.open();
    }
}

提供机箱,按钮是放置在机箱上的。机箱对象,本身有按钮,持有按钮对应的命令对象也就是Command

package day12命令模式;

/**
 * 机箱对象,本身有按钮,持有按钮对应的命令对象
 */
public class Box {
    /**
     * 开机命令对象
     */
    private Command openCommand;

    /**
     * 设置开机命令对象
     * @param openCommand 开机命令对象
     */
    public void setOpenCommand(Command openCommand) {
        this.openCommand = openCommand;
    }
    /**
     * 提供给客户使用,接收并相应用户请求,相当于那妞被按下触发的方法
     */
    public void openButton(){
        openCommand.execute();
    }
}

客户使用按钮,把与主板连接好的按钮对象放置在机箱上。

package day12命令模式;

import day12命令模式.Impl.CommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;

public class Client {
    public static void main(String[] args) {
        // 1.创建接收者
        WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();

        // 2.设置接收者与命令对象的关系  (按钮要进行开机,使用哪个主板)
        CommandImpl command = new CommandImpl(zhuban);

        // 3.创建Invoker,用Invoker来执行命令
        Box box = new Box();
        // 4.将2中绑定好关系的命令对象设置到Invoker中,让Invoker持有
        box.setOpenCommand(command);

        // 5.调用Invoker中的方法,触发要求执行命令
        // Box定义了方法,,用持有命令对象接口里面的方法,接口的实现中持有真正实现命令的接收者ZhuBanApi,
        // ZhuBanApi他去调用真正的开机方法,而这个接口有多个实现类,到底调用哪一个呢?
        // 因为在创建接收者时已经把微星这个接收者与命令对象绑定起来了,所以用的就是微星的实现类
        box.openButton();
    }
}

研磨设计模式day12命令模式,设计模式,命令模式

解析:先new一个主板,主板要跟按钮连接成为一个具体的开机命令,我又new一个机箱,把这个升级过的按钮(带有功能)装到这个机箱上,机箱最后调用这个按钮。

1.会发现命令模式的关键之处就是把请求封装成了对象,也就是命令对象,并定义了统一的执行操作的接口。

2.在命令模式中会有一个组装者,他来维护虚实现与真实实现之间的关系

参数化设置

可以用不同的命令对象,去参数化配置客户的请求

研磨设计模式day12命令模式,设计模式,命令模式

定义主板接口,现在增加一个重启的按钮,因此主板加一个方法来实现重启功能

package day12命令模式;

/**
 * 主板的接口
 */
public interface ZhuBanApi {
    /**
     * 定义一个功能:开机
     */
    public void open();
    /**
     * 定义重启功能
     */
    public void reset();
}

 实现类也要改一下

技嘉的

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

/**
 * 主板的实现
 */
public class JiJiaZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("技嘉主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }

    @Override
    public void reset() {
        System.out.println("技嘉主板现在正在重新启动机器,请等候");
        System.out.println("机器已经正常打开,请操作");
    }
}

微星的

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

/**
 * 主板的实现
 */
public class WeiXingZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("微星主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }

    @Override
    public void reset() {
        System.out.println("微星主板现在正在重新启动机器,请等候");
        System.out.println("机器已经正常打开,请操作");
    }
}

接下来定义命令和按钮,接口不变,添加一个重启命令的实现resetCommandImpl

package day12命令模式.Impl;

import day12命令模式.Command;
import day12命令模式.ZhuBanApi;

public class ResetCommandImpl implements Command {
    /**
     * 持有主板,也就是接收者对象
     */
    private ZhuBanApi zhuBanApi;

    /**
     * 构造函数传入
     * @param zhuBanApi
     */
    public ResetCommandImpl(ZhuBanApi zhuBanApi){
        this.zhuBanApi = zhuBanApi;
    }
    @Override
    public void execute() {
        this.zhuBanApi.reset();
    }
}

Box改造一下,这里增加一个重启命令对象

package day12命令模式;

/**
 * 机箱对象,本身有按钮,持有按钮对应的命令对象
 */
public class Box {
    /**
     * 开机命令对象
     */
    private Command openCommand;

    /**
     * 重启命令对象
     */
    private Command resetCommand;

    public void setResetCommand(Command resetCommand) {
        this.resetCommand = resetCommand;
    }

    /**
     * 设置开机命令对象
     * @param openCommand 开机命令对象
     */
    public void setOpenCommand(Command openCommand) {
        this.openCommand = openCommand;
    }

    /**
     * 提供给客户使用,接收并相应用户请求,相当于按钮被按下触发的方法
     */
    public void openButton(){
        openCommand.execute();
    }

    /**
     * 重启按钮
     */
    public void resetButton(){
        resetCommand.execute();
    }
}

Client

package day12命令模式;

import day12命令模式.Impl.OpenCommandImpl;
import day12命令模式.Impl.ResetCommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;

public class Client {
    public static void main(String[] args) {

        WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();


        OpenCommandImpl openCommand = new OpenCommandImpl(zhuban);
        ResetCommandImpl resetCommand = new ResetCommandImpl(zhuban);


        Box box = new Box();
        box.setOpenCommand(openCommand);
        box.setResetCommand(resetCommand);

        System.out.println("正确配置");
        System.out.println(">>>按下开机按钮:>>>");
        box.openButton();
        System.out.println(">>>按下重启按钮:>>>");
        box.resetButton();
    }
}

研磨设计模式day12命令模式,设计模式,命令模式

命令模式的优点

研磨设计模式day12命令模式,设计模式,命令模式

本质 

命令模式的本质:封装请求

何时选用

研磨设计模式day12命令模式,设计模式,命令模式

 文章来源地址https://www.toymoban.com/news/detail-672794.html

 

到了这里,关于研磨设计模式day12命令模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 研磨设计模式day11观察者模式

    目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 读者,也就是观察者 client  解析: 报社就是一个发布者,读者就是一个个订

    2024年02月11日
    浏览(24)
  • 笨蛋学设计模式结构型模式-组合模式【12】

    7.6.1概念 ​ 组合模式通过将对象组合成树状结构来表示 部分-整体 的层次关系,从而让客户端能够以同样的方式处理单个对象和对象组合,在使用中将他们视为同一类型的对象。 7.6.2场景 ​ 在文件系统中,比如目录和文件就形成了一个树形结构,目录可以包含文件以及子目

    2024年01月18日
    浏览(32)
  • 12.python设计模式【观察者模式】

    内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象得到通知并被自动更新。观者者模式又称为“发布-订阅”模式。比如天气预报,气象局分发气象数据。 角色: 抽象主题(Subject) 具体主题(ConcreteSubject)——发布者 抽象

    2024年02月15日
    浏览(31)
  • Java 与设计模式(12):享元模式

    享元模式是一种结构型设计模式,旨在有效地共享对象以减少内存使用和提高性能。该模式的核心思想是通过共享尽可能多的相似对象来减少内存占用。它将对象分为可共享的内部状态和不可共享的外部状态。内部状态是对象的固有属性,可以在多个对象之间共享,而外部状

    2024年02月12日
    浏览(28)
  • 12,【设计模式】工厂

    在C++中,“工厂”(Factory)是一种设计模式,它提供了一种创建对象的方式,将对象的创建和使用代码分离开来,提高了代码的可扩展性和可维护性。 工厂模式通过一个共同的接口或基类来定义产品对象的创建方法,而具体的对象创建过程则由子类或具体工厂来实现。通过

    2024年02月11日
    浏览(27)
  • AI Chat 设计模式:12. 享元模式

    本文是该系列的第十二篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 享元模式是一种软件设计模式,用于 提高系统的性能和内存利用率 。该模式 通过共享对象来减少内存消耗 ,特别是在大量对象需要同时

    2024年02月14日
    浏览(30)
  • day39 注解 设计模式(单例模式和工厂模式)

    @Target    @Target(ElementType.TYPE) @Target({                 ElementType.TYPE,                          ElementType.METHOD}) //确定自定义的注解的使用范围 type为类  method为方法  field为属性 @Retention @Retention()  //(不添加参数默认是class) @Retention(RetentionPolicy.CLASS)// 保留到

    2024年02月09日
    浏览(28)
  • 小谈设计模式(12)—迪米特法则

    主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 迪米特法则(Law of Demeter)也被称为最少知识原则(Least Knowledge Principle),是一种面向对象设计的原则,

    2024年02月07日
    浏览(31)
  • day25_软件设计模式

    1)创建软件应用程序是 为了满足不断变化和发展的需求 。一个成功的应用程序还应该 提供一种简单的方法来扩展 它以满足不断变化的期望。如果在设计和开发软件时应用一组面向对象的设计原则和模式,则可以避免或解决这些常见问题。 2)面向对象的设计原则也被称为

    2024年02月04日
    浏览(22)
  • python_day16_设计模式

    “”“单例模式”“” “”“工厂模式”“”

    2024年02月14日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包