设计模型之模板策略模式含UML完整实例)

设计模型之命令模式

1. 命令模式

1.1 定义与特点

  命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

  命令模式的主要优点如下:

  • 降低系统的耦合度。
  • 命令模式能将调用操作的对象与实现该操作的对象解耦。
  • 增加或删除命令非常方便。
  • 采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
  • 可以实现宏命令。
  • 命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  • 方便实现 Undo 和 Redo 操作。
  • 命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

  命令模式的缺点是:

  • 可能产生大量具体命令类。
  • 因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。

1.2 模式的结构

  命令模式包含以下主要角色:

  • 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
  • 具体命令角色(Concrete
    Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
  • 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
  • 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

1.3 问题由来

在软件开发系统中,常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如,想对行为进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与方法的实现者解耦?”变得很重要,命令模式能很好地解决这个问题。在现实生活中,这样的例子也很多,例如,电视机遥控器(方法的请求者)遥控电视机(命令接收者)
代码示例如下:


/**
 * @author tbb
 *      家用电器类
 */
public abstract class HouseholdElectricalAppliances 
{
    abstract String kind();
    abstract void open();
    abstract void close();
}

/**
 * @author tbb
 *     空调
 */
public class AirConditioning extends HouseholdElectricalAppliances  {

	@Override
	public void open() 
	{
		System.out.println("打开" + kind());
	}

	@Override
	public void close() 
	{
		System.out.println("关闭" + kind());		
	}

	@Override
	String kind() {
		return "空调";
	}

}
/**
 * @author tbb
   *      电视类
 */
public class Tv  extends HouseholdElectricalAppliances 
{

	@Override
	public void open() 
	{
		System.out.println("打开" + kind());
	}

	@Override
	public void close() 
	{
		System.out.println("关闭" + kind());		
	}

	@Override
	String kind() {
		return "电视";
	}
      
}
/**
 * @author tbb
 *      控制器
 */
public class Control 
{
     public void open(HouseholdElectricalAppliances hea)
     {
    	 hea.open();
     }
     
     public void close(HouseholdElectricalAppliances hea)
     {
    	 hea.close();
     }
     
	
}
public class Test 
{
       public static void main(String[] args) 
       {
		   Tv tv = new Tv();
		   Control control = new Control();
		   AirConditioning airConditioning = new AirConditioning();
		   control.open(tv);
		   control.close(tv);
		   control.open(airConditioning);
		   control.close(airConditioning);
		   /*
		                       打开电视
				关闭电视
				打开空调
				关闭空调
		    */
	   }
}

1.4 解决思路

  解决方法就是采用命令模型,第一步将“方法的请求者”与“方法的实现者”进行解耦,例如将电视机遥控器(方法的请求者)和遥控电视机(方法的实现者)解耦,分为电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

1.5 UML类图

在这里插入图片描述

1.6 解决方案

/**
 * @author tbb
 *     命令
 */
public interface Command 
{
    void execute();
}

/**
 * @author tbb
 *      打开命令
 */
public class OpenCommand implements Command
{
    private HouseholdElectricalAppliances hev;
    
	@Override
	public void execute() 
	{
		this.hev.open();
	}

	public OpenCommand(HouseholdElectricalAppliances hev) {
		super();
		this.hev = hev;
	}

	
	

}
/**
 * @author tbb
 *      关闭命令
 */
public class CloseCommand implements Command
{
    private HouseholdElectricalAppliances hev;
	@Override
	public void execute() 
	{
		hev.close();
	}
	public CloseCommand(HouseholdElectricalAppliances hev) {
		super();
		this.hev = hev;
	}

}
/**
 * @author tbb
 *      控制器
 */
public abstract class Control 
{
	
	abstract void open();
	abstract void close();
	
}
/**
 * @author tbb
 * 家电类控制器
 */
public class HouseholdElectricalControl extends Control{

	private Command openCommand;
	private Command closeCommand;
	
	public HouseholdElectricalControl(OpenCommand openCommand,CloseCommand closeCommand) {
		super();
		this.openCommand = openCommand;
		this.closeCommand = closeCommand;
	}

	@Override
	void open() 
	{
		this.openCommand.execute();
	}

	@Override
	void close() 
	{
		this.closeCommand.execute();
	}

}

/**
 * @author tbb
 *      家用电器类
 */
public abstract class HouseholdElectricalAppliances 
{
    abstract String kind();
    abstract void open();
    abstract void close();
}

/**
 * @author tbb
 *     空调
 */
public class AirConditioning extends HouseholdElectricalAppliances  {

	@Override
	public void open() 
	{
		System.out.println("打开" + kind());
	}

	@Override
	public void close() 
	{
		System.out.println("关闭" + kind());		
	}

	@Override
	String kind() {
		return "空调";
	}

}

/**
 * @author tbb
   *      电视类
 */
public class Tv  extends HouseholdElectricalAppliances 
{

	@Override
	public void open() 
	{
		System.out.println("打开" + kind());
	}

	@Override
	public void close() 
	{
		System.out.println("关闭" + kind());		
	}

	@Override
	String kind() {
		return "电视";
	}
      
}

public class Test 
{
     public static void main(String[] args) 
     {
    	 Tv tv = new Tv();
    	 OpenCommand openCommand = new OpenCommand(tv);
    	 CloseCommand closeCommand = new CloseCommand(tv);
    	 HouseholdElectricalControl control = new HouseholdElectricalControl(openCommand, closeCommand);
    	 control.open();
    	 control.close();
    	 AirConditioning airConditioning = new AirConditioning();
    	 openCommand = new OpenCommand(airConditioning);
    	 closeCommand = new CloseCommand(airConditioning);
    	 control = new HouseholdElectricalControl(openCommand, closeCommand);
    	 control.open();
    	 control.close();
    	 /*
	        打开电视
			关闭电视
			打开空调
			关闭空调
    	  */
     }
}
发布了56 篇原创文章 · 获赞 1 · 访问量 1168

猜你喜欢

转载自blog.csdn.net/atu1111/article/details/105550197