读书笔记_java设计模式深入研究 第十章 命令模式 Command

1,命令模式:主要针对需要执行的任务或用户提出的请求进行封装与抽象。抽象的命令接口描述了任务或请求的共同特征,而实现交由不同的具体命令对象完成。每个命令对象都是相互独立的,它负责完成需要执行的任务,却并不关心是谁调用的。

2,UML模型:

3,角色分析:

-1,ICommander:抽象命令者,是一个接口,规定了用来封装请求的若干个方法。

-2,ConcreteCommander:具体命令发送者,即命令源。实现命令接口。

-3,Invoke:请求者,具体命令的管理和维护类。请求者是包含一个“命令接口”变量的实例。请求者调用命令接口,让具体命令执行那些封装的请求方法。

-4,Reciever:命令接受者,是一个类的实例,该实例负责执行与请求相关的操作,

4,代码实例:


 

package pattern.chp10.commander.simple;

 

/**

 *  类描述:命令接口

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 11:07:14 AM   Jing   Created.

 *           

 */

public interface ICommand {

	/**

	 * 

	 * 方法说明:打扫命令

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 4, 2015 11:07:36 AM

	 *

	 * @return void

	 */

	public void sweep();

}

package pattern.chp10.commander.simple;

 

/**

 *  类描述:命令发送者

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 11:19:09 AM   Jing   Created.

 *           

 */

public class Teacher implements ICommand{

	

	private Student reciever;

 

	public Teacher(Student student) {

 

		this.reciever = student;

	}

 

	public void sweep() {

		

		reciever.sweeping();

	}

 

}

 

package pattern.chp10.commander.simple;

 

/**

 *  类描述:命令接受者,学生

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 11:07:55 AM   Jing   Created.

 *           

 */

public class Student {

	/**

	 * 

	 * 方法说明:正在打扫

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 4, 2015 11:08:36 AM

	 *

	 * @return void

	 */

	void sweeping(){

		

		System.out.println("We are sweeping the floor");

	}

}

package pattern.chp10.commander.simple;

 

/**

 *  类描述:命令请求者

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 11:21:03 AM   Jing   Created.

 *           

 */

public class Invoke {

 

	ICommand command;

 

	public Invoke(ICommand command) {

 

		this.command = command;

	}

	

	public void execute(){

		

		command.sweep();

	}

	

	

}

package pattern.chp10.commander.simple;

 

/**

 *  类描述:

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 2:31:11 PM   Jing   Created.

 *           

 */

public class MainTest {

 

	public static void main(String[] args) {

		

		Student s = new Student();

		ICommand t = new Teacher(s);

		Invoke invoke = new Invoke(t);

		invoke.execute();

	}

}

5,深入理解命令模式,命令集管理

假设输入多边形坐标,求取面积,代码如下:

·


package pattern.chp10.commander.area;

 

/**

 * 类描述:坐标

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 4, 2015 2:55:20 PM Jing Created.

 * 

 */

public class Point {

 

	float x, y;

 

	public Point(float x, float y) {

		

		this.x = x;

		this.y = y;

	}

 

}

package pattern.chp10.commander.area;

 

/**

 * 类描述:面积计算

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 4, 2015 2:56:12 PM Jing Created.

 * 

 */

public class PolyonCalc {

	/**

	 * 

	 * 方法说明:根据坐标点计算面积

	 * 

	 * Author: Jing Create Date: Jan 4, 2015 2:56:40 PM

	 * 

	 * @param pt

	 * @return

	 * @return float

	 */

	public float getArea(Point[] pt) {

 

		float s = 0;

		int size = pt.length;

		if (size < 3) {

 

			return s;

		}

 

		s = pt[0].y * (pt[size - 1].x - pt[1].x);

		for (int i = 1; i < size; i++) {

 

			s += pt[i].y * (pt[(i - 1)].x - pt[(i + 1) % size].x);

		}

 

		return (float) s / 2;

	}

}

package pattern.chp10.commander.area;

 

/**

 *  类描述:命令发送者

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 3:04:52 PM   Jing   Created.

 *           

 */

public interface ICommand {

	/**

	 * 

	 * 方法说明:计算面积

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 4, 2015 3:05:10 PM

	 *

	 * @return

	 * @return float

	 */

	float calc();

}

package pattern.chp10.commander.area;

 

/**

 * 类描述:具体面积命令发送者

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 4, 2015 3:05:44 PM Jing Created.

 * 

 */

public class AreaCommander implements ICommand {

 

	PolyonCalc calc;

	Point[] pt;

 

	public AreaCommander(PolyonCalc calc, Point[] pt) {

 

		this.calc = calc;

		this.pt = pt;

	}

 

	public float calc() {

 

		return calc.getArea(pt);

	}

 

}

package pattern.chp10.commander.area;

 

import java.util.ArrayList;

 

/**

 *  类描述:命令管理

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 4, 2015 3:07:22 PM   Jing   Created.

 *           

 */

public class CommandManage {

	

	ArrayList<ICommand> list = new ArrayList<ICommand>();

	/**

	 * 

	 * 方法说明:添加命令

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 9:41:32 AM

	 *

	 * @param c

	 * @return void

	 */

	public void add(ICommand c){

		

		list.add(c);

	}

	/**

	 * 

	 * 方法说明:执行命令

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 9:41:59 AM

	 *

	 * @return void

	 */

	public void executeCommand(){

		

		for(ICommand command : list){

			

			float value = command.calc();

			System.out.println("The area is : " + value);

		}

		

	}

	

}

 

package pattern.chp10.commander.area;

 

/**

 *  类描述:

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 9:43:15 AM   Jing   Created.

 *           

 */

public class MainTest {

 

	public static void main(String[] args) {

		

		CommandManage manage = new CommandManage();

		PolyonCalc calc = new PolyonCalc();

		Point[] pt = new Point[3];

		

		pt[0] = new Point(0, 0);

		pt[1] = new Point(1, 0);

		pt[2] = new Point(0, 1);

		

		AreaCommander com = new AreaCommander(calc, pt);

		manage.add(com);

		

		manage.executeCommand();

	}

}

6,命令模式与JDK事件处理:

JDK事件处理机制如图:

-1,事件监听器是保存侦听哪些数据源的容器,技能注册事件源,也能撤销事件源。

-2,当有事件发生的时候,事件监听器遍历监听的数据源容器,判断到底是哪个数据源产生的事件,若能找到,则执行对应的方法。

-3,事件监听是java消息处理机制的核心,由java系统完成。

7,命令模式与多线程:

连续接收字符串信息,并对重要的信息进行提示。


 

package pattern.chp10.commander.message;

 

/**

 *  类描述:信息接收功能

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 10:03:36 AM   Jing   Created.

 *           

 */

public interface ISource {

	/**

	 * 

	 * 方法说明:是否为信息标志

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 10:05:13 AM

	 *

	 * @return

	 * @return boolean

	 */

	boolean isbFire();

	

	/**

	 * 

	 * 方法说明:设置重要信息标志

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 10:05:26 AM

	 *

	 * @param bFire

	 * @return void

	 */

	void setbFire(boolean bFire);

}

 

package pattern.chp10.commander.message;

 

/**

 * 类描述:信息

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 5, 2015 10:04:59 AM Jing Created.

 * 

 */

public class Msgsrc implements ISource {

 

	String msg;

	boolean bFire;

 

	public String getMsg() {

		return msg;

	}

 

	public void setMsg(String msg) {

		this.msg = msg;

	}

 

	public boolean isbFire() {

		

		return bFire;

	}

 

	public void setbFire(boolean fire) {

 

		this.bFire = fire;

	}

	

	/**

	 * 

	 * 方法说明:判断消息

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 10:08:53 AM

	 *

	 * @param msg

	 * @return void

	 */

	public void come(String msg){

		

		this.msg = msg;

		if(msg.startsWith("zhang:")){

			

			bFire = true;

			

			//其他功能代码

		}

	}

 

}

package pattern.chp10.commander.message;

 

/**

 *  类描述:特殊消息处理功能(命令接收者)

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 10:19:57 AM   Jing   Created.

 *           

 */

public interface IReceiver {

	/**

	 * 

	 * 方法说明:消息处理

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 10:20:34 AM

	 *

	 * @param src

	 * @return void

	 */

	void process(ISource src);

}

 

package pattern.chp10.commander.message;

 

/**

 *  类描述:具体消息处理类

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 10:21:02 AM   Jing   Created.

 *           

 */

public class ShowReceive implements IReceiver {

 

	public void process(ISource src) {

		

		Msgsrc obj = (Msgsrc) src;

		System.out.println(obj.getMsg());

	}

 

}

package pattern.chp10.commander.message;

 

/**

 * 类描述:Email接受者

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 5, 2015 10:22:44 AM Jing Created.

 * 

 */

public class EmailReceive implements IReceiver {

 

	public void process(ISource src) {

 

		System.out.println("This is email receiver,ths msg is : " + ((Msgsrc) src).getMsg());

	}

 

}

package pattern.chp10.commander.message;

 

/**

 *  类描述:命令监测功能(相当于Invoke)

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 10:24:37 AM   Jing   Created.

 *           

 */

public interface ICommand {

	/**

	 * 

	 * 方法说明:消息处理

	 *

	 * Author:       Jing                

	 * Create Date:   Jan 5, 2015 10:25:39 AM

	 *

	 * @return void

	 */

	void noticeCommand();

}

package pattern.chp10.commander.message;

 

/**

 * 类描述:具体命令类

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 5, 2015 10:34:13 AM Jing Created.

 * 

 */

public class Command implements ICommand {

 

	IReceiver rvr;

	ISource src;

 

	public Command(IReceiver rvr, ISource src) {

 

		this.rvr = rvr;

		this.src = src;

	}

 

	public void noticeCommand() {

 

		rvr.process(src);

	}

}

 

package pattern.chp10.commander.message;

 

import java.util.Vector;

 

/**

 * 类描述:命令管理

 * 

 * @author: Jing

 * @version $Id: Exp$

 * 

 * History: Jan 5, 2015 10:37:15 AM Jing Created.

 * 

 */

public class CommandManage extends Thread {

 

	Vector<ICommand> v = new Vector<ICommand>();

	ISource src;

	boolean bMark = true;

 

	public CommandManage(ISource src) {

 

		this.src = src;

	}

 

	public void addCommand(ICommand c) {

 

		v.add(c);

	}

 

	public void run() {

 

		while (bMark) {

 

			if (!src.isbFire()) {

 

				continue;

			}

			for (ICommand comm : v) {

 

				comm.noticeCommand();

			}

			src.setbFire(false);

		}

	}

 

}

 

package pattern.chp10.commander.message;

 

/**

 *  类描述:

 * 

 *  @author:  Jing

 *  @version  $Id: Exp$ 

 *

 *  History:  Jan 5, 2015 10:55:06 AM   Jing   Created.

 *           

 */

public class MainTest {

 

	public static void main(String[] args) throws Exception {

		

		Msgsrc src = new Msgsrc();//定义事件源(发送者)

		ShowReceive rvr = new ShowReceive();//定义接收者

		EmailReceive rvr2 = new EmailReceive();

		

		Command com = new Command(rvr, src);//定义命令

		Command com2 = new Command(rvr2, src);//定义命令

		

		CommandManage manage = new CommandManage(src);//命令接收集 

		manage.addCommand(com);

		manage.addCommand(com2);

		manage.start();

		

		String[] s = {"Liu:sdad", "zhang:sdada", "li:sdasdasd"};

		for(String sTemp: s){

			

			src.come(sTemp);

			Thread.sleep(1000);

		}

		

		manage.bMark = false;

	}

}
时间: 2024-07-31 04:34:44

读书笔记_java设计模式深入研究 第十章 命令模式 Command的相关文章

读书笔记_java设计模式深入研究 第九章 访问者模式 Vistor

1,访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变.为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式,这就是访问者模式的动机. 2,UML图: 3,访问者角色: IElement:抽象的事物元素功能接口,定义了固定功能方法以及可变功能方法接口. Element:具体功能的实现类. IVisitor:访问者接口,为所有访问者对象声明一个visit方法,用来代表为对象结构添加的功能,原则上可

读书笔记_java设计模式深入研究 第二章 反射

1,JDK中反射类包含的内容: -1,Class类,代表一个类. -2,Constructor,代表类的构造方法. -3,Field,代表类成员 -4,Method,代表方法. 2,统一调用形式: 一个基本的使用反射的例子如下: package com.use; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class A 

读书笔记_java设计模式深入研究 第七章 代理模式 Proxy

1,代理模式:一个类可以用作其他东西的接口,其他类可以通过此类去访问被代理者. 2,UML图如下: 3,角色: ISubject:抽象主题接口,该接口定义对象和它的代理共用的接口. RealSubject:真实主题角色,使实现抽象主题接口的类. Proxy:代理角色,内部含有对真实对象的引用,从而可以操作真实对象,代理对象提供与真实对象相同的接口,以便在任何时候都可以替代真实对象. 4,简单代码: package pattern.chp07.proxy;   /** * 类描述:抽象主题接口 *

读书笔记_java设计模式深入研究 第六章 桥接模式

1,桥接模式:将抽象部分与实现部分分离,使他们可以独立变化.桥接模式可以实现的是不同方式的组合完成不同的功能,方式和功能完全分离,使得相互不影响. 2,UML模型: 3,简单代码实例: /** * * @(#) IPost.java * @Package pattern.chp06.bridge.simple * * Copyright ? JING Corporation. All rights reserved. * */ package pattern.chp06.bridge.simpl

读书笔记_java设计模式深入研究 第三章 工厂模式 Factory

1,简单工厂 -1,定制抽象接口. -2,定制具体子类. -3,定制工厂类,通过工厂类的静态方法返回不同的子类对象. package pattern.chp02.facroty; /**  *  类描述:汽车接口  *   *  @author:  Jing  *  @version  $Id: Exp$   *  *  History:  Dec 18, 2014 10:50:10 AM   Jing   Created.  *             */ public interface 

读书笔记_java设计模式深入研究 第五章 观察者模式 Observer

1,观察者模式适合解决多种对象跟踪一个对象数据变化的程序结构问题,一个称作"主题"的对象和若干个称作"观察者"的对象.在主题对象更新后会通知所有的观察者,使他们自动更新自己. 2,观察者UML类图: 3,角色解释: -1,抽象观察者(IObserver):为所有具体观察者定义接口,在得到主题通知的时候,更新观察者自身数据. -2,抽象主题(ISubject):使用数组引用维护一组观察者对象,可以增加和删除观察者,同时同志观察者自身的改变. -3,观察者(Observ

设计模式之十九:命令模式(Command)

命令模式:将一个请求封装成一个对象,从而允许用不同的请求参数化客户,对请求进行排序或记录日志,并且支持撤销操作. UML图: 主要包括: Command:声明了一个操作的接口 ConcreteCommand:绑定了一个Receiver和一个行为,通过相关联的Receiver对象实现了了execute方法. Client:创建一个ConcreteCommand对象并且设置了它的Receiver. invoker:要求命令执行请求. Receiver:知道如何实施与执行请求相关的操作. 命令模式的核

【读书笔记】设计模式第6章:行为型模式2

本文主要分析了中介者模式.观察者模式.备忘录模式.访问者模式.状态模式.解释器模式,介绍它们的定义.优缺点.使用场景,以及实例代码.为了深刻地理解设计模式,最重要的还是动手编写代码. 我参照书中的例程重新构想了一些更加生动.易于理解的例子,希望大家喜欢. 代码可以通过以下链接进行浏览: http://git.oschina.net/caipeichao/java-design-pattern 这些代码都经过编译运行,保证没有错误. 中介者模式 定义 也叫调停者模式 用一个中介对象来封装一系列同事

【读书笔记】设计模式第五章:行为型模式

本文主要分析了模板方法模式.命令模式.责任链模式.策略模式.迭代器模式,介绍它们的定义.优缺点.使用场景,以及实例代码.为了深刻地理解设计模式,最重要的还是动手编写代码. 我参照书中的例程重新构想了一些更加生动.易于理解的例子,希望大家喜欢. 代码可以通过以下链接进行浏览: http://git.oschina.net/caipeichao/java-design-pattern 这些代码都经过编译运行,保证没有错误. 模板方法 定义 定义一个操作中的算法框架,而将一些步骤延迟到子类中 角色:抽