`
lchlrb
  • 浏览: 6390 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式学习---命令模式

阅读更多
    最近在看《headfirst设计模式》一书,正开始学习设计模式不久。哎,就大四了,感觉落后了别人很多,伤感。现在也只能一步一个脚印,慢慢进步吧。
   
    其实,前面已经学过工厂模式(抽象工厂和工厂方法)、观察者模式、单件模式、策略模式。今天把命令模式看完了,看懂并不是很困难,我想困难的是如何在实际中运用它们。因为它们的确会给我们的程序带来好处,比如说解耦。

    恩,看完书,模仿了书本的例子写了下面这些,都是自己写,没看书了。例子几乎一样,本来想写空调遥控的,因为宿舍就有个,但还是觉得不一样吗?只是Light换成了空调。居于思维的局限,就没去再想其他的例子了。

   命令模式中的对象主要包括:命令对象,调用者(命令请求者),命令接受者。而命令模式就是就是通过命令对象,来实现命令请求者和命令接收者解耦。

    1.类图(见底)


    2.代码
我分了四个包,分别是:command,receiver,requester和test

    a. receiver包----接收者包,在这里,light就是接收者,由它执行最后的动作。
package reciever;

public class Light {
	//private static final int open = 0 ;
	//private static final int close = 1 ;
	
	public Light(){} 
	
	public void onlight(){
		System.out.println("The light is open!") ;
	}
	public void offlight(){
		System.out.println("The light is close!") ;
	}
}


    b.command包----命令对象包。命令对象的execute方法执行了接受者(Light)的一个或者几个action,在由调用者control确定什么时候执行execute。

 
  package command;

/*
 * Interface
 */
public interface ICommand {
	void execute() ;
	void undo() ;
}

package command;

import reciever.Light;

/*
 * 灯关的命令对象
 */
public class LightOffCommand implements ICommand {
	private Light light ;
	
	public LightOffCommand(Light light){
		this.light = light ;
	}
	
	public void execute() {
		this.light.offlight() ;
	}

	public void undo() {
		this.light.onlight() ;
	}

}


package command;

import reciever.Light;

/*
 * 灯开的命令对象
 */
public class LightOnCommand implements ICommand {

	private Light light ;
	
	public LightOnCommand(Light light){
		this.light = light ;
	}
	
	public void execute() {
		this.light.onlight() ;
	}

	public void undo() {
		this.light.offlight() ;
	}

}


package command;
/*
 * 空对象。null object
 */
public class NoCommand implements ICommand {
	//do nothing
	public void execute() {
	}

	public void undo() {
	}

}


     c.requester---指遥控器。通过setCommand()方法来获取ICommand,再由子类“决定”需要的哪个Command。通过几个Button方法,来决定什么时候执行相应的事件。接受者作出相应地反映(灯亮,灯灭)。这里即可以体会到,遥控器和灯是解耦的。

package requester;

import command.ICommand;
import command.NoCommand;

/*
 * 调用者
 */
public class RemoteControl {
	//undocommand变量用来村粗light的最后一次的状态
	private ICommand oncommand ,offcommand ,undocommand ;
	public RemoteControl(){
		this.oncommand = new NoCommand() ;
		this.offcommand = new NoCommand() ;
		this.undocommand = new NoCommand() ;
	}
	
	public void setCommand(ICommand oncommand,ICommand offcommand){
		this.oncommand = oncommand ;
		this.offcommand = offcommand ;
	}
	
	public void onButtonWasPressed(){
		oncommand.execute() ;
		this.undocommand = this.oncommand ;
	}
	
	public void offButtonWasPressed(){
		offcommand.execute() ;
		this.undocommand = this.offcommand ;
	}
	
	public void undo(){
		this.undocommand.undo() ;//取消操作
	}
}


      d.测试类
package test;

import command.ICommand;
import command.LightOffCommand;
import command.LightOnCommand;

import reciever.Light;
import requester.RemoteControl;

/*
 * Test Class
 */
public class ControlTest {
	public static void main(String[] args){
	//receiver
	Light light = new Light() ;
	
	//command
	ICommand lightOff = new LightOffCommand(light) ;
	ICommand lightOn = new LightOnCommand(light) ;
	
	//control
	RemoteControl control = new RemoteControl() ;
	control.setCommand(lightOn , lightOff) ;
	control.onButtonWasPressed() ;
	control.offButtonWasPressed() ;
	
	control.undo() ;
	//control.setCommand(lightOff) ;
	//control.offButtonWasPressed() ;
	}
}


     e.控制台输出:
The light is open!
The light is close!
The light is open!

  • 描述: 类图
  • 大小: 34.3 KB
1
0
分享到:
评论

相关推荐

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

    C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...

    设计模式6---命令模式,精美PPT

    该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习

    设计模式----命令模式

    总的来说,这个压缩包中的内容很可能是包含了一个命令模式和享元模式的示例程序,通过分析和学习这个实例,我们可以更好地理解和掌握这两种设计模式的运用场景、实现方式以及它们在实际项目中的价值。对于想要深入...

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

    通过学习和掌握GoF的23种设计模式,可以显著提高程序员的编码水平,使得开发出的软件系统更加健壮、可扩展、易维护。以上每种模式都有其特定的应用场景,理解和掌握它们的关键在于不断实践和总结,在实际项目中灵活...

    java设计模式---诙谐易懂版

    总结来说,设计模式是软件开发中的重要工具,通过学习和运用不同的设计模式和设计原则,可以帮助开发者更好地解决编程中的各种问题,提升代码质量和团队协作效率。在Java开发中,正确理解和应用这些模式和原则,对于...

    Java设计模式----通俗易懂版

    通过这个"通俗易懂版"的学习资源,你将能够深入理解每种设计模式的原理,掌握如何在实际项目中应用它们,提升代码的可维护性和复用性。阅读《设计模式_20090916.pdf》文档,结合具体的代码示例,相信你将能够更好地...

    新版设计模式手册 - C#设计模式(第二版)

    总之,《新版设计模式手册 - C#设计模式(第二版)》是学习和掌握C#设计模式的宝贵资源,通过学习和实践书中的内容,开发者能够提升软件设计能力,编写出更优雅、可维护的代码。这本书将帮助你从一个代码实现者成长为...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

    设计模式学习笔记-命令模式

    命令模式是一种行为设计模式,它的主要目的是将请求封装为对象,以便于参数化不同请求、队列请求、记录请求日志以及支持撤销和重做操作。在软件开发中,它帮助解耦了请求发起者(调用者)和请求执行者(接收者),...

    26种设计模式-----pdf

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种...通过深入学习和实践这些设计模式,开发者可以进一步提升自己的编程技能,更好地应对各种复杂的软件设计挑战。

    C++设计模式-基于QT4开源跨平台开发框架 源码

    通过学习和应用这些设计模式,开发者可以更好地组织代码,提高代码的可扩展性和可维护性。QT4的API设计也鼓励了这些模式的使用,使得开发者能够构建出高效、可复用的跨平台应用程序。对于初学者,理解这些模式并将其...

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

    这份PPT涵盖了设计模式的全貌,对于初学者来说,是一个很好的学习资源。通过深入学习这些模式,开发者可以更好地理解和应用面向对象设计原则,提升代码质量和可维护性。同时,理解并熟练运用设计模式,也是成为一名...

    设计模式-Java语言中的应用

    通过阅读《设计模式-Java语言中的应用》,读者不仅可以掌握设计模式的基本概念和原理,还能学习到如何在实际项目中选择合适的设计模式,以及如何优雅地在Java代码中实现这些模式。这将有助于提升开发者的编程技巧,...

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

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

    23种设计模式代码-c#

    设计模式是软件工程中的一种最佳实践,用于解决常见的编程问题,提供可复用的解决方案。...在VS2012环境下,你可以通过这些代码学习如何在C#中组织和编写符合设计模式原则的代码,从而提高代码质量和可维护性。

Global site tag (gtag.js) - Google Analytics