Java设计模式之命令模式详解
作者:在下木子李 发布时间:2023-11-15 21:18:43
标签:Java,命令模式,设计模式
命令模式
定义:将请求封装成对象,这可以让你使用不同的请求、队列、或者日志来参数化其他对象。
何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。
在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
调用者通过调用命令对象的execute()方法发出请求,这会使接收者的动作被调用。
调用者可以接收命令当作参数,甚至在运行时动态地进行。
优点:
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
实现案例
需求:实现一个遥控器类,遥控器有多组开/关按钮,每组按钮控制一个电器对象的开和关。使用命令模式实现整个功能。
1、创建命令接口
package com.example.designpatternsdemo.commandPattern;
/**
* 命令接口
*/
public interface Command {
public void execute();
}
2、创建电灯、电视类(命令接收者)
package com.example.designpatternsdemo.commandPattern;
/**
* 电灯
*/
public class Light {
//on/off动作
public void on(){
System.out.println("开启电灯");
}
public void off(){
System.out.println("关闭电灯");
}
}
package com.example.designpatternsdemo.commandPattern;
/**
* 电视
*/
public class TV {
public void on(){
System.out.println("开启电视");
}
public void off(){
System.out.println("关闭电视");
}
}
3、创建具体命令类
package com.example.designpatternsdemo.commandPattern;
/**
* 开启电灯命令类
*/
public class LightOnCommand implements Command{
//电灯对象
private Light mLight;
public LightOnCommand(Light light){
this.mLight = light;
}
@Override
public void execute() {
mLight.on();
}
}
package com.example.designpatternsdemo.commandPattern;
/**
* 关闭电灯命令类
*/
public class LightOffCommand implements Command{
//电灯对象
private Light mLight;
public LightOffCommand(Light light){
this.mLight = light;
}
@Override
public void execute() {
mLight.off();
}
}
这里省略电视的开关命令类
4、创建遥控器类
package com.example.designpatternsdemo.commandPattern;
/**
* 命令调用者
* 遥控器
*/
public class RemoteControl {
//保存开关命令对象的数组
Command[] onCommands;
Command[] offCommands;
public RemoteControl(){
//初始化数组
onCommands = new Command[2];
offCommands = new Command[2];
}
//存储命令
public void setCommand(int index,Command onCommand,Command offCommand){
onCommands[index] = onCommand;
offCommands[index] = offCommand;
}
//开按钮
public void onButtonPress(int btnIndex){
onCommands[btnIndex].execute();
}
//关按钮
public void offButtonPress(int btnIndex){
offCommands[btnIndex].execute();
}
}
5、创建客户类(测试类)
package com.example.designpatternsdemo.commandPattern;
public class Client {
public static void main(String[] args) {
//创建电灯对象(命令接收者)
Light myLight = new Light();
//创建电灯开关命令对象
LightOnCommand lightOnCommand = new LightOnCommand(myLight);
LightOffCommand lightOffCommand = new LightOffCommand(myLight);
//创建遥控器对象(命令调用者)
RemoteControl remoteControl = new RemoteControl();
//设置命令
remoteControl.setCommand(0,lightOnCommand,lightOffCommand);
//发起命令执行请求
remoteControl.onButtonPress(0);
remoteControl.offButtonPress(0);
TV myTv = new TV();
TvOnCommand tvOnCommand = new TvOnCommand(myTv);
TvOffCommand tvOffCommand = new TvOffCommand(myTv);
remoteControl.setCommand(1,tvOnCommand,tvOffCommand);
remoteControl.onButtonPress(1);
remoteControl.offButtonPress(1);
}
}
将开/关电灯、电视的请求封装成命令类对象,在类中的execute()方法调用具体电灯/电视的开关动作,调用时,遥控器类(命令调用者)只需调用具体某个命令对象的execute()方法,那他就会通知具体的电器来执行动作,这样,就实现了命令调用者和执行者之间的解耦。调用者不需要知道是谁执行动作,只需要调用命令对象的execute()方法去通知执行就可以。
来源:https://blog.csdn.net/weixin_44902943/article/details/116118136
0
投稿
猜你喜欢
- 介绍什么是ThreadLocal?ThreadLocal叫做线程变量,用于在多线程环境下创建线程本地变量。通俗的讲,ThreadLocal可
- 一、线程的优先级别线程优先级别的使用范例:package cn.galc.test;public class TestThread6 { p
- 静态库和动态库的区别1、静态库的扩展名一般为".a"或者".lib";动态库的扩展名一般为"
- 配置文件中设置通常在公司级别的项目中,我们可能会写多个application- dev/prod.yml ,然后我们通常会在applicat
- 什么是队列结构一种线性结构,具有特殊的运算法则【只能在一端(队头)删除,在另一端(队尾)插入】。分类:顺序队列结构链式队列结构基本操作:入队
- 前言本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。读Hex写CS
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- Zookeeper和Eureka哪个更好?1、CAP理论一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求C:数据一致性
- 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。举例:把订阅报纸的人看作是观察者,把报纸
- 一、SpringCache介绍Spring Cache 是一个优秀的缓存组件。自Spring 3.1起,提供了类似于@Transaction
- 背景:本人不是Java开发人员,经过四年多的历练,可以说是一枚BI攻城师了吧,最近粗糙的写了一个Portal来集成cognos报表,下面就入
- 资源加载器使用Java,您可以使用当前线程的classLoader并尝试加载文件,但是Spring Framework为您提供了更为优雅的解
- 概述什么是动态编程?动态编程解决什么问题?Java中如何使用?什么原理?如何改进?(需要我们一起探索,由于自己也是比较菜,一般深入不到这个程
- 前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析。PaginatedDataTablePaginatedDataT
- 本文研究的主要是优化MyBatis配置文件中的配置的相关内容,具体介绍如下。一、连接数据库的配置单独放在一个properties文件中之前,
- 1.概述在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现SSO - 单点登录。我们将使用
- 我们通过学习Java基础知识,让自己正式踏入学习Java语言的行列,这篇博客是用来让我们真正的了解并应用面向对象的思想来实现的。使用简单的J
- 摘要:vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 前几天在跟公司大佬讨论一个问题时,看到他使用Handler的一种方式,旁边的同事在说:以前不是这么用的啊。这个问题引发了我的好奇,虽然当时翻