问题

某个类中需要定义一个方法,该方法要实现的功能不确定的,需要等到程序执行该方法的时候才确定下来。

例如:定义一个计算数组的方法,可能需要遍历输出数组,也有可能是需要对数组中元素求和。

解决方案

按照面向对象程序设计的原则,如果在设计类的时候,成员方法在不同的类中具体实现也是不同的,这种变化的方法可以抽取出来,形成接口。接口可以作为具体业务类的成员变量或者方法参数进行使用。

在本例中,接口将作为业务处理类的方法参数,和待处理数据构成方法的参数列表。这种设计模式即为:命令模式(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)的更多相关文章

  1. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  2. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  3. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  4. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  5. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

  6. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  7. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  8. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  9. 设计模式----行为型模式之命令模式(Command Pattern)

    下面来自head first设计模式的命令模式一章节. 定义 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图 注: 1. ...

  10. 设计模式(六):控制台中的“命令模式”(Command Pattern)

    今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...

随机推荐

  1. vs2008工程部署不成功,可能是远程文件路径出现问题

    解决方法: 修改工程属性页的配置属性 调试中的远程可执行文件的路径 部署中的远程目录的路径

  2. vs2008控制台程序运行一闪而过,不显示按任意键继续

    调试运行(F5)而且没插断点.且程序没有暂停的点,就会一闪而过 直接执行(Ctrl+F5),在程序结束前会有“按任意键继续” 当你不想进入调试状态,只想看一看程序执行结果时用ctrl+f5F5会进入调 ...

  3. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时3

    课时3 计算机视觉历史回顾与介绍下 ImageNet有5000万张图片,全部都是人工清洗过得,标注了超过2万个分类. CS231n将聚焦于视觉识别问题,图像分类关注的是大图整体:物体检测告诉你东西具体 ...

  4. hdoj5328【尺取】

    现在在队内赛(灰常艾斯比的队内赛),还是来写篇题解开心一下,23333. 题意: 就是问你找出一个最长的等比数列或者等差数列 思路: 一个等差的尺取,一个等比的尺取.2333,就这么过了,具体自己写吧 ...

  5. 如何阻止浏览器的默认事件,你是否也遇到过无法阻止Google默认事件的情况( 原生JS )

    如题,话不多话,我们先看怎么解决 根据不同的绑定事件的方法,我们有不同的阻止默认事件的方法 如果你不知到如何绑定事件,请查看我的上一篇文章 关于浏览器滚动的兼容性问题以及事件绑定 1.句柄绑定 只需要 ...

  6. 【POJ - 3190 】Stall Reservations(贪心+优先队列)

    Stall Reservations 原文是English,这里直接上中文吧 Descriptions: 这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于 ...

  7. javascript E5面向对象和 E6面向对象

    javascript es6之前的面向对象方法: 一般使用构造函数来实现 function Person (name, age) { this.name = name; this.age = age; ...

  8. iOS UITableView reloadData 刷新结束后执行后续操作

    如果在reloadData后需要立即获取tableview的cell.高度,或者需要滚动tableview. 如果直接在reloadData后执行代码是有可能出问题的,比如indexPath为nil等 ...

  9. Centos6.8 搭建 Mysql 主从复制

    实例环境: MySQL-Master:Centos-6.8:192.168.153.130 MySQL-Slave:Centos-6.8:192.168.153.131 1.两台服务器安装mysql ...

  10. css3 background-size属性--ie兼容

    css3 background-size属性--ie兼容 safari浏览器对background-size 属性显示原始大小 background-size: cover not working o ...