本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、场景描述

智能电脑的品牌越来越多,由此诞生了一款电脑控制的APP,万能遥控器,用户在使用遥控器的时候,可以切换为自家电视的品牌,然后对电视进行控制。

2、代码实现

public class C01_InScene {
public static void main(String[] args) {
TVClient tvClient = new TVClient() ;
Remote remote = new RemoteApp(tvClient) ;
UserClient userClient = new UserClient(remote) ;
userClient.action("HM","换台");
}
}
/**
* 遥控接口
*/
interface Remote {
void controlTV (String tvType,String task);
}
/**
* 遥控器APP
*/
class RemoteApp implements Remote {
private TVClient tvClient = null ;
public RemoteApp (TVClient tvClient){
this.tvClient = tvClient ;
}
@Override
public void controlTV(String tvType, String task) {
tvClient.action(tvType,task);
}
}
/**
* 用户端
*/
class UserClient {
// 持有遥控器
private Remote remote = null ;
public UserClient (Remote remote){
this.remote = remote ;
}
public void action (String tvType, String task){
remote.controlTV(tvType,task);
}
}
/**
* 电视端
*/
class TVClient {
public void action (String tvType, String task){
System.out.println("TV品牌:"+tvType+";执行:"+task);
}
}

二、命令模式

1、基础概念

命令模式属于对象的行为模式。命令模式把一个请求或者操作封装到一个对象中。把发出命令的动作和执行命令的动作分割开,委派给不同的对象。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行。

2、模式图解

3、核心角色

  • 命令角色

声明所有具体命令类的抽象接口。

  • 具体命令角色

定义接收者和行为之间的交互方式:实现execute()方法,调用接收者的相应操作 , 传递命令信息。

  • 请求者角色

负责调用命令对象执行请求,相关的方法叫做行动方法。

  • 接收者角色

执行请求。任何一个类都可以成为接收者,执行请求的方法叫做行动方法。

4、源码实现

public class C02_Command {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action("卧倒");
}
}
/**
* 命令角色
*/
interface Command {
// 执行方法
void execute(String task);
}
/**
* 具体命令角色类
*/
class ConcreteCommand implements Command {
//持有相应的接收者对象
private Receiver receiver = null;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute(String task) {
//接收方来真正执行请求
receiver.action(task);
}
}
/**
* 请求者角色类
*/
class Invoker {
// 持有命令对象
private Command command = null;
public Invoker(Command command){
this.command = command;
}
// 行动方法
public void action(String task){
command.execute(task);
}
}
/**
* 接收者角色类
*/
class Receiver {
// 执行命令操作
public void action(String task){
System.out.println("执行命令:"+task);
}
}

三、Spring框架应用

Spring框架中封装的JdbcTemplate类API使用到了命令模式。

1、JdbcOperations接口

public interface JdbcOperations {
@Nullable
<T> T execute(StatementCallback<T> var1) ;
}

2、JdbcTemplate类

这里只保留模式方法的代码。

public class JdbcTemplate implements JdbcOperations {
@Nullable
public <T> T execute(StatementCallback<T> action) {
try {
T result = action.doInStatement(stmt);
} catch (SQLException var9) {
} finally {
}
}
}

3、StatementCallback接口

@FunctionalInterface
public interface StatementCallback<T> {
@Nullable
T doInStatement(Statement var1) ;
}

四、命令模式总结

  • 松散的耦合

命令模式使得命令发起者和命令执行者解耦,发起命令的对象完全不知道具体实现对象是谁。这和常见的MQ消息队列原理是类似的。

  • 动态的控制

命令模式把请求封装起来,可以动态地对它进行参数化、队列化和等操作和管理,使系统更加的灵活。

  • 良好的扩展性

命令发起者和命令执行者实现完全解耦,因此扩展添加新命令很容易。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java设计模式(20):命令模式的更多相关文章

  1. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  2. Java设计模式 之 命令模式

    1      从属模式分类 行为性模式 2      命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...

  3. JAVA设计模式之 命令模式【Command Pattern】

    一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...

  4. 14.java设计模式之命令模式

    基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...

  5. java设计模式之命令模式

    学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ...

  6. java设计模式之命令模式以及在java中作用

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...

  7. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...

  8. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  9. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  10. java设计模式5--原型模式(Prototype)

    本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...

随机推荐

  1. 从.NET CORE2.2升级到3.0过程及遇到的一些问题

    RoadFlow工作流引擎从.NET Core2.2升级到3.0遇到了一些问题及解决方式这里记录一下. 1.DLL项目框架从2.2选择到3.0,这个没什么好说的,没有问题.重点的WEB层的一些变化. ...

  2. (未完)XSS漏洞实战靶场笔记

    记录下自己写的XSS靶场的write up,也是学习了常见xss漏洞类型的实战场景

  3. 程序员成长的四个简单技巧,你 get 了吗?

    最近拜读了"阿里工程师的自我修养"手册,12 位技术专家分享生涯感悟来帮助我们这些菜鸡更好的成长,度过中年危机,我收获颇多,其中有不少的方法技巧和我正在使用的,这让我觉得我做的这些 ...

  4. composer依赖管理与laravel框架安装

    步骤有点多,生怕哪一天忘记,记录下来会好点 laravel安装有两种途径:1.直接在一些国内第三方网站,如:https://www.golaravel.com/download/ 下载压缩包来解压即可 ...

  5. 基于mysql-8.0.16-winx64的主从搭建

    1.主服务器的my.ini文件内容:[mysqld]# 主库和从库需要不一致server-id=1log-bin=mysql-bin# 同步的数据库binlog-do-db=master-slave# ...

  6. SpringBoot 开发案例之参数传递的正确姿势

    前言 开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼. 姿势 学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复 ...

  7. 以np.concatenate为主题,谈谈numpy数组按维度合并的问题

    1.引言 最近在做多模态融合的图像问题,其中最需要解决的就是不同模态的图像用什么方法进行融合,最简单也最直观的方法就是采用合并数组的方法,将不同模态的图像合并为多通道进行处理.在一些论文中,比如< ...

  8. (day28)操作系统发展史+进程

    目录 一.操作系统发展史 (一)穿孔卡片(手工操作) (二)批处理系统(磁带存储) 1. 联机批处理系统 2. 脱机批处理系统 (三)多道技术 二.进程 (一)程序和进程 (二)进程调度 1. 先来先 ...

  9. 【Java必修课】通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  10. 最常用 最完整 最清晰 的git使用命令大全!

    Git 常用命令 初始化项目步骤 mkdir WebApp //创建文件夹 cd WebApp //进入到该文件夹 git init //初始化 touch README //生成README git ...