zoukankan      html  css  js  c++  java
  • 【设计模式】行为型06命令模式(Command Pattern)

    命令模式

        个人理解:命令模式,本质上是一种多层次的封装。

        好处:降低耦合,扩展极其方便。

        以下一段文案摘抄自:http://www.runoob.com/design-pattern/command-pattern.html个人有些难以深入理解,待日后细细体会:

        意图:命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开。

        主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

        何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

       如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

        博主参考了网上很多例子,去掉了一些冗余功能,精简了demo使其更加便于理解,如下:

        类图(晚上画):

        代码:

        1、实际的请求类,拥有所有的具体功能:

    package com.pat.command;
    
    
    /**
     * 请求类-具体被操作
     * @author ZX
     */
    public class Receiver{
    
    	public void takeOff() {
    		System.out.println("起飞功能");
    	}
    	public void land() {
    		System.out.println("降落功能");
    	}
    	
    }

    2、命令的封装:

    package com.pat.command;
    /**
     * 命令类,所有的命令
     * @author ZX
     *
     */
    public abstract class Command {
    	public abstract void execute();
    }
    /**
     * 命令A
     * @author Administrator
     *
     */
    class CommandA extends Command{
        Receiver receiver;
    	@Override
    	public void execute() {
    		receiver.takeOff();
    		
    	}
    	public CommandA(Receiver receiver) {
    		this.receiver=receiver;
    	}
    }
    /**
     * 命令B
     * @author Administrator
     *
     */
    class CommandB extends Command{
        Receiver receiver;
    	@Override
    	public void execute() {
    		receiver.land();
    		
    	}
    	public CommandB(Receiver receiver) {
    		this.receiver=receiver;
    	}
    }

    3、控制中心:

    package com.pat.command;
    /**
     * 指挥中心
     * @author ZX
     *
     */
    public class CommandCenter {
    	private Command command;
    	public CommandCenter(Command command) {
    		this.command=command;
    	}
    	public void call() {
    		command.execute();
    	}
    }
    

    4、测试类:

    package com.pat.command;
    
    public class Test {
    	public static void main(String[] args) {
    		//指挥中心执行A命令
    		CommandCenter APlan = new CommandCenter(new CommandA(new Receiver()));
    		APlan.call();
    		//指挥中心执行B命令
    		CommandCenter BPlan= new CommandCenter(new CommandB(new Receiver()));
    		BPlan.call();
    	}
    }
    

    5、结果:

    起飞功能
    降落功能
  • 相关阅读:
    HBase api
    使用memcached缓存 替代solr中的LRUCache缓存
    Solrj
    在Solr中配置中文分词IKAnalyzer
    (转载)怎样让自己内心强大起来?
    (转载)Linux一句话精彩
    (转载)C++创建对象的两种方法
    (转载)puremvc框架之proxy
    (转载)AS3领航系列教程 之 AS3程序的入口
    (转载)Flash Number 数据类型
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054147.html
Copyright © 2011-2022 走看看