`
biqing0427
  • 浏览: 57293 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

我工作的那点事--设计模式实例应用(Command模式)

阅读更多

   好长时间没有学习设计模式了,主要是最近一直在忙德国的一个需求,现在终于可以休息下了,不过下周又要开始新的需求了。唉,不断的项目,不停的工作。 现在闲下来 回头看看设计模式,发现我们的工作模式,其实可以用 Command 的模式实现的,我们都是按 boss Command 办事的,呵呵。 1. 下面先讲讲我们的工作模式吧: 首先,德国那边 boss 提出要求,然后发给德国的经理,经理按照 boss 的意思,形成具体的需求样式,然后将这些样式发给我们,我们按照需求完成任务。

                  Boss---------->manager------- > developer

 

 

  2. 看看设计模式中对 Command 的定义吧:

书上对 Command 的定义过于复杂,个人的理解是这样的:就是将一些操作封装成 command 命令,每个命令中含有 (execute) ,然后发给接受者,接受者不管 command 的类型或者内容,只要打开 command 命令,然后安装它的意图执行 (execute) 就可以了。

安装以上的理解,一个 Command 模式应该包括以下部分:

1.       Command:

2.       Client: 创建一个命令,并且设定它的接受者

3.       invoker :要求执行这个命令

4.       Receiver :接到命令,并且按照执行。

 

他们之间的静态图如下:

                              

 

[Command 模式类图出自: wikimedia.org]

 

 

3. 对照这个模式,就很容易将我的工作模式用这个模式实现了,下面看看整个过程吧:

  很明显,我工作中的几个角色如下:

1.Command:

   Requirement: 这里就是各种需求了。

2.Client: 创建一个命令,并且设定它的接受者

   Boss:Boss 的作用

3.invoker

  Manager: 根据老板的意思形成命令,并交给 developer 开发

4.Receiver :接到命令,并且按照执行。

  Developer: 得到需求后,找到需求的入口,然后按照这个要求一步步完成。

  

 

1.   Boss 类:

       

public class Boss {
	String order;// 用于产生命令

	Manager manager;// 指定命令的接受者

	public Manager getReceiver() {
		return manager;
	}

	public void setReceiver(Manager manager) {
		this.manager = manager;
	}

	public String getOrder() {
		return order;
	}

	public void setOrder(String order) {
		this.order = order;
	}

	public void orderCommand() {
		manager.setOrder(order);// 给manager下达命令
	}
}

 

 

       2. Manager 类:

 

public class Manager {
	String order;
	Developer developer;
	Requirement requirement = null;

	public String getOrder() {
		return order;
	}

	// 用于接受命令
	public void setOrder(String order) {
		this.order = order;
	}

	// 根据boss的命令 产生需求。
	public void setRequirement() {
		if (order.equals("A")) {
			requirement = new RequirementA();
		} else if (order.equals("B")) {
			requirement = new RequirementB();
		}
	}

	// 通知让developer工作
	public void invoker() {
		developer.setRequirement(requirement);// 告诉developer具体需求
		developer.action();// 唤起developer
	}

	public Developer getDeveloper() {
		return developer;
	}

	public void setDeveloper(Developer developer) {
		this.developer = developer;
	}
}

 

 

3.    Developer 类:


public class Developer {
	Requirement requirement = null;

	public Requirement getRequirement() {
		return requirement;
	}

	// 得到需求。
	public void setRequirement(Requirement requirement) {
		this.requirement = requirement;
	}

	public void action() {
		requirement.execute();// 只要按照要求做就可以了。
	}
}
  

4. Requirment 类:


public interface Requirement {
    public void execute();
}

 

public class RequirementA implements Requirement {
	private void stepFirst() {
		System.out.println("stepFirst runs");
	}

	private void stepSecond() {
		System.out.println("stepSecond runs");
	}

	public void execute() {
		System.out.println("now operate requirementA");
		// 先执行第一步,然后再执行第二步。
		stepFirst();
		stepSecond();
	}
}
 
public class RequirementB implements Requirement {
	
        private void stepFirst() {
		System.out.println("stepFirst runs");
	}

	private void stepSecond() {
		System.out.println("stepSecond runs");
	}

	public void execute() {
		System.out.println("now operate requirementB");
		// 不同于第一步
		stepSecond();
		stepFirst();
	}
}
 

 

5. 看看测试过程吧: 这里我用的是 junit4 具体使用请参考我的另一篇文章 (junit4 快速入门 )  

import org.junit.Test;
import org.junit.Before;
import org.junit.After;

public class WorkflowTest {

	String order = "";
	Boss boss;
	Developer developer;
	Manager manager;
	Requirement requirement;

	@Before
	public void init(){
		boss = new Boss();
		developer= new Developer();
		manager = new Manager();
	}
	
	@Test
	public void runRequirmentA(){
           requirement = new RequirmentA();
    	    order = "A";
        //boss的工作 
		boss.setOrder(order);
        boss.setReceiver(manager);
        boss.orderCommand();
        //manager的工作
        manager.setDeveloper(developer);
        manager.setRequirement(requirement);
        manager.invoker();
	}

	@Test
	public void runRequirmentB(){
           requirement = new RequirmentB();
	    order = "B";
        //boss的工作 
	    boss.setOrder(order);
        boss.setReceiver(manager);
        boss.orderCommand();
        //manager的工作
        manager.setDeveloper(developer);
        manager.setRequirement(requirement);
        manager.invoker();
	}
	
	@After
	public void destory(){
		boss = null;
		developer= null;
		manager = null;	
	}
}

 

6. 输出结果:

now operate requirementA
stepFirst runs
stepSecond runs

now operate requirementB
stepSecond runs
stepFirst runs

分享到:
评论
10 楼 yangtao309 2008-07-21  
搂在没有测试吧...
抛出空指针异常
在下面这个类 需要对接口requirement指定实现类
@Test 
public void runRequirmentA(){
   requirement = new RequirementA();
不过还是谢谢 搂在讲的比较详细...
9 楼 biqing0427 2008-02-14  
不知道怎么在文章中插入图片,希望大家指点下,谢谢。
8 楼 biqing0427 2008-02-01  
引用
wubaodan
能不能把版排一下!


前段时间比较忙,没有时间修改。
现特重新排版,谢谢大家的关注。
7 楼 banner 2008-02-01  
模式也是方法论,感觉很多东西都是相通的
6 楼 galaxystar 2008-01-31  
command模式,除了自身依赖外,可以隔离所有的其他依赖。
5 楼 jomper 2008-01-31  
ls 你为什么要把这个挖出来...
4 楼 wubaodan 2008-01-31  
能不能把版排一下!
3 楼 java9981 2008-01-25  
Command模式里的concreteCommand封装的是具体的命令,是最终要执行的行为,应该只有developer才能够建立(根据需求建立具体的计划),然后由Manager调用(安排时间,人力执行,而不管具体要怎么做)
2 楼 gmizr 2008-01-24  
这个排版太无敌了
1 楼 hanyu87 2008-01-24  
层次挺清晰的!Boss------>manager----àdeveloper

相关推荐

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    这本书详细阐述了23种设计模式,这些模式被广泛应用于各种编程语言,包括C++。 1. **创建型模式**:这类模式主要关注对象的创建过程,它们提供了一种在不指定具体类的情况下创建对象的方法,使得系统更加灵活和可...

    设计模式那点事

    《设计模式那点事》这本书的PPT为我们提供了一种深入理解和学习设计模式的途径。在这里,我们将深入探讨设计模式的核心概念、分类以及它们在实际开发中的应用。 首先,设计模式基于面向对象编程思想,其核心目标是...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    设计模式的学习不仅是为了记住每种模式的应用场景,更重要的是理解其背后的原理和设计理念。通过深入学习和实践,开发者可以逐渐掌握这些模式,并将其内化为自己的设计思维。设计模式的学习过程虽然漫长且充满挑战,...

    设计模式实例代码

    在本案例中,我们聚焦于C#语言中的设计模式,通过"设计模式实例代码"这个项目,我们可以深入理解并学习这些模式的实际应用。 "设计模式"标签表明了这个压缩包的内容主要围绕设计模式展开,涵盖了面向对象设计的核心...

    24种设计模式以及混合设计模式

    1. 在Web开发中,Spring框架就广泛应用了设计模式,如工厂模式用于创建Bean,单例模式保证每个Bean只有一个实例,观察者模式用于事件驱动编程,策略模式用于实现AOP(面向切面编程)。 2. 在游戏开发中,状态模式常...

    java设计模式实例

    本资源“java设计模式实例”旨在通过实际的代码示例帮助程序员深入理解并熟练应用设计模式。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在Java中,通常使用双重检查锁定(Double-...

    设计模式专题---设计模式示例代码(全)(python--c++)

    3. **Singleton模式**:Singleton是创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,Singleton需要考虑线程安全问题,以防止多个线程同时创建多个实例。 4. **Visitor模式**:...

    设计模式PPT---25种设计模式详解

    这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对25种主要的设计模式进行了详尽的阐述。 首先,我们要理解设计模式的基本概念。设计模式不是代码,而是一种...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它提供了一种解决常见问题的方法论。GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的...

    设计模式精解-GoF23种设计模式解析附C++实现源码

    C++实现源码提供了具体编程环境下的应用实例,帮助读者更好地理解和应用这些设计模式。通过阅读和实践这些源码,开发者可以更深入地掌握如何在实际项目中灵活运用设计模式,提升代码质量和可维护性。

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

    设计模式那点事_软件小蜜

    《设计模式那点事》可能是某位作者(这里称为“guangpan”)关于设计模式讲解的PPT资料,旨在让那些无法购买书籍的学习者也能接触到这个主题。 设计模式的核心在于它们是经过验证的、在实际编程中行之有效的经验...

    极客学院java-23种设计模式

    下面,我们将详细探讨这些设计模式以及它们在实际开发中的应用。 1. 创建型设计模式: - 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 - 原型模式(Prototype):通过复制已有对象来创建...

    设计模式精解-GoF 23种设计模式解析附

    通过学习设计模式,我们可以更好地组织代码结构,提高软件质量,同时减少开发过程中的重复工作。本文将详细介绍GoF提出的23种设计模式,并提供C++实现示例,帮助读者深入理解这些模式的应用场景和技术细节。 #### ...

    JAVA之23种设计模式的完整实例代码和注释

    这些设计模式的实例代码和注释对于学习和理解如何在实际项目中应用它们非常有价值。通过深入研究这些模式,开发者可以提升代码质量,减少代码重复,以及更好地应对软件需求的变化。同时,理解和掌握设计模式也是成为...

    Command模式(Java设计模式)

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...

    Observer与Command模式在VTK类库设计中的应用研究

    为了更好地理解和利用VTK的强大功能,本文将详细介绍Observer与Command两种设计模式在VTK类库设计中的应用。 #### 二、Observer/Command设计模式概述 ##### 1. Observer模式 Observer模式是一种行为设计模式,...

Global site tag (gtag.js) - Google Analytics