欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之 Command通俗理解

程序员文章站 2022-03-10 17:17:14
1 command模式定义Commad模式是一种对象行为模式, 它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)2 通俗理解简单来看,在对象A调用了对象B的一个方法,这样对象A就可以看做一个发送者,对象B就是一个接收者,在这种情况下,对象A必须知道对象B相应的方法名。如果在这里使用Command模式的话,就相当于在对象A和对象....

1 command模式定义

Commad模式是一种对象行为模式, 它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)

 

2 通俗理解

简单来看,在对象A调用了对象B的一个方法,这样对象A就可以看做一个发送者,对象B就是一个接收者,在这种情况下,对象A必须知道对象B相应的方法名。如果在这里使用Command模式的话,就相当于在对象A和对象B之间加了一个中间层,由中间层来完成这一次的调用,在这种情况下,对象A并不需要知道对象B的方法。

3 如何使用?

举例:将命令封装在一个 Collection 的 List 中,任何对象一旦加入 List 中,实际上装入了一个封闭的黑盒中,对象的特性消失了,只有取出时,才有可能模糊的分辨出。

package xx.study.design.commad;

/**
 * 典型的 Command 模式需要有一个接口.
 * 接口中有一个统一的方法,这就是"将命令/请求封装为对象
 */
public interface Command {
    public void execute ( );
}
package xx.study.design.commad;

public class Engineer implements Command {
    public void execute( ) {
        //do Engineer's command
        System.out.println("开始铺路");
    }
}
package xx.study.design.commad;

/**
 * 政治家
 */
public class Politician implements Command {
    public void execute( ) {
        //do Politician's command
        System.out.println("开始巡查");
    }
}

 

package xx.study.design.commad;

/**
 * 程序设计人员
 */
public class Programmer implements Command {
    public void execute( ) {
        //do programmer's command
        System.out.println("开始设计");

    }
}

 

package xx.study.design.commad;

import java.util.ArrayList;
import java.util.List;

/**
 * 将三个command封装起来,扔到黑盒子 List 里去:
 */
public class Producer {
    public static List produceRequests() {
        List queue = new ArrayList();
        queue.add( new Engineer() );
        queue.add( new Politician() );
        queue.add( new Programmer() );
        return queue;
    }
}

 

package xx.study.design.commad;

import java.util.Iterator;
import java.util.List;

public class Customer {
    public static void main(String[] args) {
        //下发指令
        List queue = Producer.produceRequests();
        //调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程
        for (Iterator it = queue.iterator();it.hasNext(); ){
            //客户端直接调用 execute 方法,无需知道被调用者的其它更多类的方法名。
            ((Command)it.next()).execute();
        }


    }
}

 

本文地址:https://blog.csdn.net/h4241778/article/details/107887773