`
美丽的小岛
  • 浏览: 310825 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

命令模式与生活

阅读更多

一般的情况下,我们人与人(或者物与物)交流都是直接沟通。



 

但是,觉得这样的依赖性实现在太强的,想改变一下模式,不过,也这个也是合乎基本规律的。



 
构造了如下图:

 

 



 

好了,这个抽象的行为就是我们所要求的,而对于这个能满足我们要求的行为实现者是谁,我们不想去知道,我们能达到我们目的就得了。呵呵。
好的,引入命令模式!
定义:把一个请求或者操作封装在命令对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
结构:

Invoker类:被客户端调用,可以接受命令请求,设计命令队列,决定是否相应该请求,记录或撤销或重做命令请求,记录日志等等
Command类(一般都是Interface):将一个请求封装成一个对象,将一个请求具体化,方便对请求记录。
ConcreteCommand类,可以将Receiver对象放到这个类里面,这个类具体实现了要怎么处理这个用户的请求。
Receiver类,其实这个类可以没有,不过为了让设计看起来更整洁清楚。
如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

很形象的例子:



 
对于这个服务员厨师的例子比较好的了。其实在生活上,例子到处都是,发生在身边的事情就很好。举个例子去说明一下。
成立一个大学生研究工作室,导师给某同学选成负责人,叫他L主任,L主任被委以重任说:“这个工作室就交给你了,发挥自己的主观能动性,一定要把这个实验室搞起来。”导师考虑得很周到,为了工作室的日常记录,安排了一个秘书,叫Z秘书。工作室分为很多个部门,有专门负责老师上课,这个专门做上课课件的,叫PPT部门,负责人A部长。有平时负责学生在线辅导测试的,叫test部门,负责人B部长,假设暂时列举这两个部门。
某日,导师有指示了,跟L主任说,现在要改革,重做PPT,另外,为了推进教育改革,增加信心,加强对学生的测试与促进学生学习的积极性。L主任接到任务后,准备下达命令让各个部门去实施!好了,这个命令下达得去用点技巧了,L主任不想像导师那样,直接命令,可能效果不是很太好,L主任想到了Z秘书。L主任把要做的事情都吩咐给Z秘书,让秘书去完成,最后还说了一句:“Z秘书呀,你要盯住他们呀,一定要让他们做完,每天都要去督促他们。”Z秘书虽然心中觉得有点不情愿,但还是答应了。
分析:
导师与L主任是直接沟通;



 

L主任下达命令:




 
 

进一步看看L主任的情况:



 
用面向对象的想法去想想,一切皆是对象,好的,那些命令也是对象,那些人也是对象。想想对于秘书还行增加一些方法,如果L主任改主意了,她不要去做这些事情了。

好啦!接下来不是逻辑来的了,用计算去模拟一下这个过程吧。用java实现。

 

Command.java
package test.Gof.command;

public interface Command {
	void excute() ;
}

PPTCommand.java
package test.Gof.command;

public class PPTCommand implements Command {
	private A a = null;

	public PPTCommand(A a) {
		this.a = a ;
	}

	
	public void excute() {
		System.out.println(a.getName()+" will go to "+"make PPT!! ");
	}

}


TestCommand.java
package test.Gof.command;

public class TestCommand implements Command {
	private B b = null;

	public TestCommand(B b) {
		this.b = b;
	}

	public void excute() {
		System.out.println(b.getName() + " will go to " + "test!! ");
	}

}

A.java
package test.Gof.command;

public class A {
	private String name = "A-department";

	public A() {
	}

	public A(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

B.java
package test.Gof.command;

public class B {
	private String name = "B-department";

	public B() {
	}

	public B(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

SecretaryZ.java
package test.Gof.command;

import java.util.ArrayList;
import java.util.List;

public class SecretaryZ {
	List<Command> record = new ArrayList<Command>();

	public SecretaryZ add(Command com){
		record.add(com) ;
		return this ;
	}
	public void notifyCom() {
		for (Command com : record) {
			com.excute();
		}
	}

	public void undo(Command command) {
		record.remove(command);
	}

	public void redo(Command command) {
		notifyCom();
	}
}

LDirector.java
package test.Gof.command;

public class LDirector {
	public static void main(String[] args) {
		A a = new A() ;
		B b = new B() ;
		Command com1 = new PPTCommand(a) ;
		Command com2 = new TestCommand(b) ;
		SecretaryZ secretary = new SecretaryZ() ;
		secretary.add(com1).add(com2).notifyCom() ;
	}
}

 

显示结果:

 

A-department will go to make PPT!!
B-department will go to test!!

 

 

  • 大小: 6.6 KB
  • 大小: 19.2 KB
  • 大小: 1 KB
  • 大小: 7.8 KB
  • 大小: 136.6 KB
  • 大小: 9.9 KB
  • 大小: 68.5 KB
  • 大小: 68.3 KB
0
0
分享到:
评论

相关推荐

    java设计模式之命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,命令模式是一种非常实用的设计模式,它能帮助我们...

    设计模式--命令模式 (模仿遥控器)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本例中,我们将通过模仿遥控器来理解命令模式的应用。 遥控器...

    设计模式之命令模式

    现实生活中命令模式无处不在,比如我们去餐厅吃饭,服务员记录我们想要的食物的名称,然后放到后台,过一会厨师拿到订就可以烹饪食物了。而命令模式所发挥的作用就是把客户想要的食物而发出的命令(也就是订单)进行...

    活学活用 生活中的设计模式

    命令模式是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **关键知识点**: - **基本概念**:将一个请求封装为一个...

    23种面向对象设计模式

    关注对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento...

    Head First(Design Patterns) 设计模式英文原版

     6命令模式封装调用  7适配器模式与外观模式随遇模式  8模板方法模式封装算法  9选代器与组合模式管理良好的集合  10状态模式事物的状态  11代理模式控制对象访问  12复合模式模式中的模型  ...

    深入浅出java设计模式(高清中文PDF)

    所涉及的设计模式包括工厂模式、单例模式、建造模式、原型模式、适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式...

    Java多功能计算器+设计模式+开发文档

    一共使用了建造者模式、状态模式、命令模式、策略模式、单件模式这5个设计模式。 本次课程设计是开发一款有多个面板的计算器。不仅有针对日常生活“标准型”面板、针对理工科计算的“科学型”面板、针对于编程人员...

    HeadFirst设计模式英文版

    这些模式包括但不限于单例模式(Singleton)、工厂方法模式(Factory ...命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式、...

    新版设计模式手册[C#].

    《新版设计模式手册[C#]》是一本深入浅出介绍设计模式的专著,它将抽象的编程概念与现实生活中的实例相结合,使读者能够轻松理解并应用这些模式。设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时,...

    java23种设计模式与追MM

    15. **命令模式**:GG的追求行动可以看作一个个命令,命令模式封装请求作为对象,便于参数化、队列化和撤销。 16. **迭代器模式**:GG遍历追求MM的各种方法,迭代器模式提供一种遍历集合对象的方式,而无需暴露其...

    【爱生活的程序员-法宗】UML和模式应用(第三版).pdf

    - 命令模式 #### 应用场景示例 - **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 - **观察者模式**:当对象的状态改变时通知其所有依赖者。 - **策略模式**:定义一系列算法,并将每个算法封装...

    【让设计优化户外生活】-java23种设计模式.docx

    16. **命令模式**:将一个请求封装为一个对象,以便使用不同的请求、队列或者日志请求,以及支持可撤销的操作。户外活动中,命令模式可用于控制各种设备的开关或设置。 17. **解释器模式**:给定一种语言,定义其...

    Head First 之之观察者模式

    5. **扩展与变体**:书籍可能会讨论一些观察者模式的扩展形式,比如发布-订阅模式(Publish/Subscribe),以及它与其他设计模式(如命令模式、中介者模式)的结合使用。 6. **源码解析**:提供的源码可能包含了一些...

    从追MM谈JAVA的23种设计模式

    命令模式将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销操作。 15. **解释器模式(Interpreter)**:如果MM喜欢解谜,解释器模式可以用于定义语言的文法并解释这些语言。 16. **迭代器模式...

    图解追mm和23种设计模式(通过追MM,图解23种设计模式,有图有例子)

    14. 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求或支持撤销/重做。在追求过程中,你可以精心设计一系列行动,逐一执行。 15. 责任链模式:让多个对象都有机会处理请求,形成一条链,避免请求的...

    JAVA的设计模式

    本文将深入探讨设计模式的概念,以及JAVA中最常见的几种设计模式——工厂模式、观察者模式、单例模式、命令模式、建造者模式、适配器模式、合成模式、桥梁模式等,同时结合清华大学学者张跃平在其著作《JAVA设计模式...

    设计模式 Head First

    #### 第13章:现实世界中的模式——更好地生活与模式 本章将设计模式的应用带入了现实生活中的例子,展示了如何在真实的项目中应用这些模式来解决问题。通过具体案例,读者可以更好地理解设计模式的实际价值。 ###...

    Wlan常用命令.pdf

    这篇文档《Wlan常用命令.pdf》提供的内容恰好覆盖了与WLAN相关的常见命令及其用途,下面详细介绍一下这些命令所涉及的知识点。 首先,文档提到了AP(Access Point,接入点)的管理。AP是连接有线和无线网络的设备,...

Global site tag (gtag.js) - Google Analytics