`
836811384
  • 浏览: 547728 次
文章分类
社区版块
存档分类
最新评论

command设计模式和回调机制

 
阅读更多

总结command设计模式和回调机制,说明这两者之间的联系,并且用command模式来实现回调机制。command设计模式是回调机制的一个面向对象的替代品。

一、首先介绍回调机制

回调机制:一开始,一个类定义了一些个未实现的方法,并且该类并不知道这些方法具体的实现是怎么样的,因为只有等到运行时候才能够知道这些方法的具体实现。等到具体要用到该类对象的时候,才对该类中的抽象方法定义实现。该实现的过程由client来实现。具体的代码如下所示:

回调类

package callback;

/**
 * 回调接口
 * 
 * @author typ
 * 
 */
public abstract class ICallBack {
	/**
	 * 需要回调的方法。即在回调时候需要实现的方法
	 */
	public abstract void callback();
}
需要调用callback的类

package callback;

/**
 * 某个类需要调用回调接口中的方法
 * 
 * @author typ
 * 
 */
public class A {
	ICallBack iCallBack;

	/**
	 * 在此处调用回调接口时候,要先实现该接口
	 * 
	 * @param iCallBack
	 */
	public void setICallBack(ICallBack iCallBack) {
		this.iCallBack = iCallBack;
	}

	/**
	 * 调用回调接口中的方法,当然调用之前要先实现callback方法
	 */
	public void doSomeThing() {
		iCallBack.callback();
	}
}
测试类client

package callback;

/**
 * 在运行的时候才能确定回调方法的具体实现
 * 
 * @author typ
 * 
 */
public class Client {
	public static void main(String[] args) {
		A a = new A();

		a.setICallBack(new ICallBack() {

			/* 此处在创建ICallBack对象时候,定义callback函数的方法体
			 * (non-Javadoc)
			 * @see callback.ICallBack#callback()
			 */
			public void callback() {
				System.out.println("A is running, and call back is running!");
			}
		});

		a.doSomeThing();
	}
}

二、command设计模式

命令模式是对命令的封装。命令模式把发出命令的调用方和执行命令的接收方分割开,对两者之间解耦。

每一个命令都是一个操作:调用方发出请求要求执行一个操作;接收方收到请求,并执行操作。如果没有命令模式,那么,调用方要存放一个接收方的引用,这样增加了他们之间的耦合性。命令模式允许调用方和接收方独立开来,使得调用方不必知道接收方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。并且利用command模式还可以执行redo和undo操作。代码走起:

命令接收方,其实最终还是接收方来执行命令

package command;

/**
 * 命令的接收者
 * 
 * @author typ
 * 
 */
public class Receiver {
	public void execute() {
		System.out.println("receiver is executing!");
	}
}

command抽象类,保存一个指向接收方的引用,定义了一个execute方法,在子类中是想

package command;

/**
 * 命令的抽象类,用于封装不同类型的命令和接收者
 * 
 * @author typ
 * 
 */
public abstract class Command {
	Receiver receiver;

	Command(Receiver receiver) {
		this.receiver = receiver;
	}

	public abstract void execute();

}

command的具体子类

package command;

public class ConcreteCommand extends Command {
	ConcreteCommand(Receiver receiver) {
		super(receiver);
	}

	public void execute() {
		receiver.execute();
	}
}

调用方,保存一个指向命令command的引用,可以传入任何具体的command

package command;

/**
 * 调用者
 * 
 * @author typ
 * 
 */
public class Invoker {
	Command command;

	public Invoker() {
	}

	/**
	 * 执行command
	 */
	public void invoke() {
		command.execute();
	}

	public void setCommand(Command command) {
		this.command = command;
	}
}

client测试类

package command;

/**
 * 测试类
 * 
 * @author typ
 * 
 */
public class Client {
	public static void main(String[] args) {
		Receiver receiver = new Receiver();
		Command command = new ConcreteCommand(receiver);
		Invoker invoker = new Invoker();
		invoker.setCommand(command);
		invoker.invoke();
	}
}

三、command模式如何替代回调机制

"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。使用命令模式作为"CallBack"在面向对象系统中的替代。

下面我们就在回调机制上面改,如下:

回调类改为command类

package comm_call;

/**
 * 回调接口--相当于Command类
 * 
 * @author typ
 * 
 */
public abstract class ICallBack {
	/**
	 * 需要回调的方法。即在回调时候需要实现的方法
	 */
	public abstract void callback();
}

ICallBackImpl相当于ConcreteCommand

package comm_call;

/**
 * ICallBack的实现类,这个类相当于Command的具体实现类ConcreteCommand
 * @author typ
 *
 */
public class ICallBackImpl extends ICallBack {

	public void callback() {
		System.out.println("A is running, and call back is running!");
	}

}

调用方类

package comm_call;

/**
 * 该类作为调用方类
 * 
 * @author typ
 * 
 */
public class A {
	ICallBack iCallBack;

	/**
	 * 在此处调用回调接口时候,要先实现该接口
	 * 
	 * @param iCallBack
	 */
	public void setICallBack(ICallBack iCallBack) {
		this.iCallBack = iCallBack;
	}

	/**
	 * 调用回调接口中的方法,当然调用之前要先实现callback方法
	 */
	public void doSomeThing() {
		iCallBack.callback();
	}
}

测试类Client

package comm_call;

/**
 * 在运行的时候传入command对象,而不是实现回调方法
 * 
 * @author typ
 * 
 */
public class Client {
	public static void main(String[] args) {
		A a = new A();
		ICallBackImpl iCallBackImpl = new ICallBackImpl();
		// 此处传入iCallBackImpl是一个命令的对象,回调机制中此处传入的是一个回调类
		a.setICallBack(iCallBackImpl);
		a.doSomeThing();
	}
}












分享到:
评论

相关推荐

    详解设计模式中的Command命令模式及相关C++实现

    命令模式的作用是将一个请求封装为一个对象,从而使你可用不同的请求对...另外,我们可以将请求接收者的处理抽象出来作为参数传给Command对象,实际也就是回调的机制来实现这一点。也就是讲处理操作方法地址通过参数传

    PHP设计模式之命令模式的深入解析

    例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。 注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。在...

    asp.net知识库

    Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0...

    C++面试题精选,经典面试题

    4、 你熟悉设计模式吗?什么是command模式? 5、 如果希望把对象成员函数指针作为回调函数要考虑什么? 6、 类的静态成员变量与全局变量的比较? 7、 什么是抽象类?释构函数可以声时为抽象函数吗? 8、 谈谈你对...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    Node.CLI-Progress:命令行终端应用程序易于使用的进度条

    TTY和NOTTY模式无需回调-设计为纯外部控件的UI小部件在异步和同步任务中工作预设/主题支持自定义栏格式器(通过回调)用法可以使用多个示例,例如只需尝试$ node example.js const cliProgress = require ( 'cli-...

    ASP.NET2.0高级编程(第4版)1/6

    4.5.1 比较典型的回送和回调104 4.5.2 使用回调功能:  一种简单的方法105 4.5.3 使用带参数的回调功能110 4.6 小结113 第5章 ASP.NET Web服务器控件115 5.1 Web服务器控件概述115 5.2 Label服务器控件116 5.3 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    4.5.1 比较典型的回送和回调 104 4.5.2 使用回调功能:一种简单的方法 105 4.5.3 使用带参数的回调功能 110 4.6 小结 113 第5章 ASP.NET Web服务器控件 115 5.1 Web服务器控件概述 115 5.2 Label服务器控件 ...

    Visual Basic 6编程技术大全 中译本扫描版带书签 2/2

    16.5.3执行回调技术623 第17章ActiveX控件627 17.1 ActiveX控件基础知识627 17.1.1创建UserControl模块627 17.1.2运行ActiveX Control Interface wizard629 17.1.3添加欠缺的部分631 17.2 UserControl对象635 17.2.1...

    Visual Basic 6编程技术大全 中译本扫描版带书签 1/2

    16.5.3执行回调技术623 第17章ActiveX控件627 17.1 ActiveX控件基础知识627 17.1.1创建UserControl模块627 17.1.2运行ActiveX Control Interface wizard629 17.1.3添加欠缺的部分631 17.2 UserControl对象635 17.2.1...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    ASP.NET Night Words

    第5章 page类和回调技术 46 5.1 page类介绍 46 5.1.1 单文件页模型 46 5.1.2 代码隐藏页模型 48 5.2 asp.net页面的生命周期 50 5.3 利用page的事件进行统一 5.3 身份验证 52 5.4 ispostback属性 54 5.5 ...

    ARCH4系统开发指南

    2.23.4 关于回调函数 64 2.24 同一个Edit页面用于多模块多actionType的实现方法 64 2.25 在Action和ServiceSpringImpl中读取资源文件 65 2.26 异常管理 65 2.26.1 分类概述 65 2.26.2 异常与系统架构的关系图 66 ...

    【卷一/共两卷】AJAX实战pdf高清版90M

    2.5.4 使用回调函数监视请求 2.5.5 完整的生命周期 2.6 Ajax有何不同 2.7 小结 2.8 资源 第3章 使AjaX秩序井然 3.1 从混沌到秩序 3.1.1 模式:创造通用的词汇表 3.1.2 重构与Ajax 3.1.3 保持均衡 3.1.4 重构实战 3.2...

    Tcl_TK编程权威指南pdf

    回调与名字空间 内省(introspection) namespace命令 转换现有的软件包以使用名字空间 [incrtcl]对象系统 注意事项 第15章 国际化(internationalization) 字符集与编码 消息目录 第16章 事件驱动的编程 ...

    【05-面向对象(下)】

    •接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。 •接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。 接口与抽象类的区别 ...

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

    MFC的程序框架剖析

    创建框架类和视图类,从这里也可以看出MFC体系结构中文档、框架、视图“三位一体”的模式,在这一个函数中同时创建三个类;再会调用pDocument->OnNewDocument();因此就会进入到子类的文档类中的pDocument->...

    KODExplorer 芒果云-资源管理器

    - 加载文件列表改为异步方式,数据返回采用回调函数方式。增强体验 - 选中优化,文件&文件夹重命名、文件&文件夹新建 后自动选中。(f5增加回调。); - 选中保持,选中后如果调整排序等等,保持选中状态。 - 上传文件...

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

Global site tag (gtag.js) - Google Analytics