本文源码: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. 教你用Vue写一个开心消消乐

    之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来.后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来. 效 ...

  2. Linux重要配置文件

    目录 简介 0x01 系统重要文件 0x02 用户重要文件 0x03 重要日志文件 本教程概述 本课时学习Linux系统中重要的配置文件. 用到的工具 SshClient Ubuntu 标签 Linu ...

  3. Spring Cloud OAuth2 实现用户认证及单点登录

    文章较长,建议推荐,建议转发,建议收藏,建议关注公众号哈. OAuth 2 有四种授权模式,分别是授权码模式(authorization code).简化模式(implicit).密码模式(resou ...

  4. swap()函数的几种写法及优劣

    试用几种方法实现swap函数,比较效率高低. 首先说结果,最快的是赋值交换. 原因分析 gcc开启O2优化后,三个函数的汇编代码一样.是的,除了第一行的文件名,一模一样. 附代码 void swap1 ...

  5. Open vSwitch系列之一 Open vSwitch诞生

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs 2006年,SDN诞生于美国GENI项目资助的斯坦福大学Clean Slate课题 ...

  6. Element filtername is not allowed here-web.xml version="3.0"-intellij idea

    Element filtername is not allowed here-web.xml version="3.0"-intellij idea Intellij IDEA 报 ...

  7. JVM(6) 字节码执行引擎

    编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载 ...

  8. unity www下载导致内存占用增加问题

    服务端或者数据库更改导致客户端更改,最合理的处理方法是客户端时刻检测版本号(可以通过实时检测版本号),如果实时刷新数据库的数据开销比较大,尤其是有图片元素时. 采用unity www类下载时,虽然结束 ...

  9. django-URL重定向(八)

    HttpResponseRedirect()不常用 redirect(to,permanent=False,*args,**kwargs) to:指重定向的位置,可以是视图,也可以是url地址,也可以 ...

  10. 配置Spring Boot 跨域后PUT,DELETE方法出现403Forbidden

    配置类 @Configuration public class CorsConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { ...