文档章节

java设计模式(十四)--命令模式

合拍
 合拍
发布于 2017/08/20 20:55
字数 758
阅读 4
收藏 0

对于命令模式,就像电视机的遥控器一样,就是那种按钮绑定着一个命令,一按下去他就会执行事件,命令模式中的请求者有着与之对应的命令,每个命令又由指定的接收者发出。 网络上的专业解释: 此模式将请求以命令的形式包裹在对象中,并传给调用对象,调用对象再寻找可以处理该命令的合适对象,并把该命令传给这个对象去处理请求。

实例:用命令模式做一个遥控器来实现电视以及电灯的开关操作。

以下是我针对此实例所画的类图:

输入图片说明

以下是我按照类图所编代码:

1.完成命令接口以及打开和关闭实现类代码的编写

 //指令
interface Order{
	//运行
	void execute();
}

//关闭指令
public class TurnOffOrder implements Order
{
	private ResponseManager response;
	public TurnOffOrder(ResponseManager response)
	{
		this.response = response;
	}
	@Override
	public void execute()
	{
		response.turnOff();
	}
}

//打开指令
public class TurnOnOrder implements Order
{
	private ResponseManager response;
	public TurnOnOrder(ResponseManager response)
	{
		this.response = response;
	}
	@Override
	public void execute()
	{
		response.turnOn();
	}
}

2.完成命令接收接口以及电视和电灯实现类代码得编写

 //接收者接口
public interface ResponseManager
{
	//打开
	void turnOn();
	//关闭
	void turnOff();
}

//智能家居遥控器电视指令的接收者
public class Tv implements ResponseManager
{

	@Override
	public void turnOn()
	{
		System.out.println("TV is turned on.");
		
	}

	@Override
	public void turnOff()
	{
		System.out.println("TV is turned off.");
		
	}

}

//智能家居遥控器电灯指令的接收者
public class Light implements ResponseManager
{

	@Override
	public void turnOn()
	{
		System.out.println("Light are turned on.");

	}

	@Override
	public void turnOff()
	{
		System.out.println("Light are turned off.");

	}

}

3.完成命令请求者(遥控器)代码的编写

 //请求控制器(即智能家居全局遥控器)
public class RequestControler
{
	private Order on,off;

	//将所有的指令全部都以功能键的形式装到遥控器上
	public RequestControler(Order on, Order off)
	{
		this.on = on;
		this.off = off;
	}
	
	public void toOn(){
		on.execute();
	}
	
	public void toOff(){
		off.execute();
	}
}

4.编写测试类,测试遥控器是否管用

//测试遥控器有没有用
public class Test
{
	public static void main(String[] args)
	{
		//创建电视和电灯的开关命令
		TurnOffOrder tvOff=new TurnOffOrder(new Tv());
		TurnOffOrder lightOff=new TurnOffOrder(new Light());
		TurnOnOrder tvOn=new TurnOnOrder(new Tv());
		TurnOnOrder lightOn=new TurnOnOrder(new Light());
		
		//创建一个电灯功能遥控器
		RequestControler lightControler=new RequestControler(lightOn, lightOff); 
		//创建一个电视功能遥控器
		RequestControler tvControler=new RequestControler(tvOn, tvOff);
		
		//按下这两个遥控器试试如何吧
		lightControler.toOn();
		lightControler.toOff();
		tvControler.toOn();
		tvControler.toOff();
		
		
	}
}

5.后台输出

Light are turned on.
Light are turned off.
TV is turned on.
TV is turned off.

从我画的类图可以看得出来,这个命令模式的优点:

     		1.实现了接收者和请求者的解耦
    	 	2.使系统结构更加有有层次感,思维更清晰

缺点:

                1.要增加指令的时候要在请求发出者(遥控器)上修改源代码,所以违背了”开闭原则”
  		2.在类图上就可以看出,我们每一个命令都要对应一个接收者的相应的处理类,所以,这样每次加指令的时候会使机构更加庞大

© 著作权归作者所有

合拍
粉丝 1
博文 24
码字总数 20938
作品 0
滨州
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
289
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
214
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
277
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部