• 设计模式之命令模式(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

  • 相关阅读:
    ios-UserDefaults
    ios-滚动视图滚动取消键盘
    ios-获取商店已上线app信息
    ios-WKWebView 拨打电话
    ios-获取通讯录 姓名和电话
    ios-model数据结构
    ios-改变button四个角的弧度
    ios-高德、百度后台定位并上传服务器
    ios-系统警告框 跳转到设置里面
    Java精讲:生产者-消费者
  • 原文地址:https://www.cnblogs.com/vokie/p/3602073.html
Copyright © 2020-2023  润新知