zoukankan      html  css  js  c++  java
  • 设计模式之命令模式(Command)

    命令模式,个人理解:将具体的类的A方法抽象提升到父类层次,这样在调用时,就可以直接依据当前类来选择相关方法并执行,有点像C++中的虚函数。简写的伪代码:

    父类 F 中的方法eat(). 子类A,B各自实现自己的eat方法,比如A.eat(){吃梨子},B.eat(){吃米饭}

    测试主程序:

    F a = new A();

    F b = new B();

    a.eat();  //显示吃梨子

    b.eat(); //显示吃米饭

    但是我们可以看出来a,b都是F类型,这个就可以在调用时方便数据的传送了。

    假如现在有一个函数eatSomething(F f),我们调用的时候就可以这样来写:eatSomething(a),eatSomething(b). 好处不言而喻,注意细细体会。

    其实命令模式的精髓也是如此。把命令抽象,让不同的命令都可以使用相同的接口去执行。在调用者跟执行者之间可以解耦。我这里模仿的案例是:老板与员工的关系,老板发布工作命令,员工执行,老板发布休息命令,员工执行。先看具体的代码:

    public interface Command {
    	public void execute();
    }
    
    public class WorkCommand implements Command {
    	public Worker worker;
    
    	public WorkCommand(Worker w) {
    		worker = w;
    	}
    
    	@Override
    	public void execute() {
    		worker.work();
    	}
    }
    
    public class RestCommand implements Command {
    	Worker worker;
    
    	public RestCommand(Worker w) {
    		worker = w;
    	}
    
    	@Override
    	public void execute() {
    		worker.rest();
    	}
    
    }
    
    public class Boss {
    	private Command command;
    
    	public void setCommand(Command c) {
    		command = c;
    	}
    
    	public void executeCommand() {
    		command.execute();
    	}
    }
    
    public class Worker {
    
    	public void work() {
    		System.out.println("Workers are Working");
    
    	}
    
    	public void rest() {
    		System.out.println("Workers are Resting");
    
    	}
    
    }
    
    public class Main {
    	public static void main(String[] args) {
    		Boss boss = new Boss();
    		Worker w = new Worker();
    		// 工作Command
    		Command c1 = new WorkCommand(w);
    
    		boss.setCommand(c1);
    		boss.executeCommand();
    
    		System.out.println("===============分割线===============");
    		// 休息Command
    		Command c2 = new RestCommand(w);
    
    		boss.setCommand(c2);
    		boss.executeCommand();
    	}
    }
    


    运行结果:

    Workers are Working
    ===============分割线===============
    Workers are Resting
    


    这里的命令虽然有work和rest这两套命令,但是对boss来说都是Command,他只要setCommand(),然后就可以执行了。所以Boss并不用考虑具体的Command类型,他只管发布命令就行了。这就是Command类型向上提升的好处。

    总结一下:

    1)需要Command的interface或者抽象类的类型提升

    2)Command的execute方法的具体实现是决定当前命令由谁来具体执行,不用老板来考虑哪个工人来工作,老板只要发布命令就好了。

    3)注意函数的参数类型都是提升的类型如Boss.setCommand(Command c),好处就是Boss可以不用考虑具体的命令是什么~

    项目源码链接:http://www.kuaipan.cn/file/id_132802506211221453.htm?source=1

  • 相关阅读:
    android service
    Java 枚举7常见种用法
    SkylineGlobe Android 开发 面积计算示例代码
    SkylineGlobe 6.6 版本API更新
    SkylineGlobe 移动端开发测试
    SkylineGlobe 如何二次开发获取三维模型的BBOX和设置Tint属性
    SkylineGlobe 如何二次开发实现天际线分析功能
    SkylineGlobe API 如何以图层的方式导入MPT地形
    SkylineGlobe 如何使用二次开发接口创建粒子效果
    SkylineGlobe 支持火狐和谷歌浏览器的可运行示例代码
  • 原文地址:https://www.cnblogs.com/vokie/p/3602073.html
Copyright © 2011-2022 走看看