设计模式:命令模式(Command Pattern)
问题
某个类中需要定义一个方法,该方法要实现的功能不确定的,需要等到程序执行该方法的时候才确定下来。
例如:定义一个计算数组的方法,可能需要遍历输出数组,也有可能是需要对数组中元素求和。
解决方案
按照面向对象程序设计的原则,如果在设计类的时候,成员方法在不同的类中具体实现也是不同的,这种变化的方法可以抽取出来,形成接口。接口可以作为具体业务类的成员变量或者方法参数进行使用。
在本例中,接口将作为业务处理类的方法参数,和待处理数据构成方法的参数列表。这种设计模式即为:命令模式(Command Pattern),即向一个方法传入行为。
代码实现
1.把变化的行为定义为接口
/**把变化的行为定义为接口*/
public interface ICommand {
/**处理数据的抽象方法*/
void process(int[] data);
}
2.定义业务处理类
/**数据处理业务类*/
public class DataProcess {
public void service(int[] data,ICommand command){
command.process(data);
}
}
业务处理类中,service方法用于处理数组的计算,计算方法依赖于ICommand接口的实现。程序运行的时候,根据传入ICommand接口不同的实现类,实现对数组data的不同计算方式。
3.定义不同的计算数组方法的实现类
定义第一种计算方法:
/**遍历输出数组元素*/
public class PrintCommand implements ICommand {
@Override
public void process(int[] data) {
System.out.print("数组data中的元素有:");
for(int item:data){
System.out.print(item+" ");
}
}
}
定义第二种计算方法:
/** 数组进行累加计算 */
public class AddCommand implements ICommand {
@Override
public void process(int[] data) {
int sum=0;
for(int i=0;i<data.length;i++){
sum+=data[i];
}
System.out.println("数组所有元素之和为:"+sum);
}
}
4.测试实现
public static void main(String[] args) {
DataProcess dp = new DataProcess();
int[] data = { 1, 2, -10, 9, 18 };
ICommand ic = new AddCommand();
dp.service(data, ic);// 数组累加
ic = new PrintCommand();
dp.service(data, ic);// 数组遍历输出
}
5.输出效果
总结
在本例中ICommad接口也称为“命令”,实际程序运行中,客户端调用传入的命令可能不同,因此需要把该命令抽象成接口,并作为业务类方法的参数进行使用,程序运行时可以传入不同的接口实现类,完成命令的具体实现。该设计模式就称为命令模式。
设计模式:命令模式(Command Pattern)的更多相关文章
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- C#设计模式——命令模式(Command Pattern)
一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- 设计模式-15命令模式(Command Pattern)
1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...
- 设计模式----行为型模式之命令模式(Command Pattern)
下面来自head first设计模式的命令模式一章节. 定义 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图 注: 1. ...
- 设计模式(六):控制台中的“命令模式”(Command Pattern)
今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...
随机推荐
- UltraISO制作U盘启动盘-centos7
1.下载.安装UltraISO软件,(网上找到下载) 2.安装好以后,打开软件,显示如下界面: 3.选择镜像 点击菜单栏的“文件”选项,再点击“打开”按钮,选择要刻录的系统镜像: 4.点击菜单栏的“启 ...
- js、匿名函数、闭包、回调函数
234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...
- 搜狗输入法ubuntu
1.下载搜狗输入法的安装包 下载地址为:http://pinyin.sogou.com/linux/ ,如下图,要选择与自己系统位数一致的安装包,我的系统是64位,所以我下载64位的安装包 2.按键C ...
- SAE上无法加载css等文件
如果你的SAE用到了这些文件,你会发现本地虽然能够运行成功,但是SAE上却无法加载. 其实就是地址发生了变化,我们告诉SAE这些东西怎么找就可以了. 例如我的css和js文件放在了app/static ...
- Codeforces Round #544 (Div. 3) A.Middle of the Contest
链接:https://codeforces.com/contest/1133/problem/A 题意: 给两个时间点,求中间时间点. 思路: 数学 代码: #include <bits/std ...
- UVA - 11082 Matrix Decompressing
2. B - Matrix Decompressing 题意:定义一个R*C的正整数矩阵(1<=R,C<=20),设Ai为前i行所有元素之和,Bi为前i列所有元素之和. 题目已知R,C和数 ...
- 洛谷 P3935 Calculating
虽然对这道题没有什么帮助,但是还是记一下:约数个数也是可以线性筛的 http://www.cnblogs.com/xzz_233/p/8365414.html 测正确性题目:https://www.l ...
- LIS 2015百度之星初赛2 HDOJ 5256 序列变换
题目传送门 题意:中文题面 分析:LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载)加入序列是1,2,2,2,3,这样求上升子序列是3,也就是 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(二)
参数绑定 在上一章的示例中,我们使用Spring Cloud Feign实现的是一个不带参数的REST服务绑定.然而现实系统中的各种业务接口要比它复杂得多,我们有时会在HTTP的各个位置传入各种不同类 ...
- vue 模拟后台数据(加载本地json文件)调试
首先创建一个本地json文件,放在项目中如下 { "runRedLight":{ "CurrentPage": 1, "TotalPages" ...