设计模式19——Command设计模式

Command命令设计模式将一个请求封装成一个对象,从而使你可用不一样的请求对客户进行操做。Command命令设计模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不一样的对象。每个命令都是一个操做,命令请求发出请求要求执行一个操做;命令接受方收到请求,并执行操做。命令模式容许命令请求方和命令接收方独立开来,使得命令请求方没必要 知道命令接收方的接口,更没必要知道请求是怎么被接收,以及操做是否被执行,什么时候被执行,以及是怎么被执行的。 java

Command命令设计模式结构以下: 设计模式

Command命令设计模式中5个角色: this

(1).客户角色:建立了一个具体命令对象并肯定其接收者。 
(2).命令角色:声明了一个给全部具体命令类的抽象接口。这是一个抽象角色,一般由一个java接口或java抽象类实现。 
(3).具体命令角色:定义一个接受者和行为之间的弱耦合;实现execute方法,负责调用接收者的相应操做。execute方法一般叫作 执行方法。 
(4).请求者(Invoke)角色:负责调用命令对象执行请求,相关的方法叫作行动方法。 
(5).接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类均可以成为接收者,实施和执行请求的方法叫作行动方法。 spa

Command命令设计模式例子代码以下: 设计

//请求者角色  
class Invoker{  
    private Command command; 
 
    public Invoker(Command command){  
        this.command = command;  
    }  

    public void action(){  
        command.execute();  
    }  
}  


//接收者  
class Receiver{  
    //行动方法  
    public void action(){  
        System.out.println("Action has been taken.");  
    }  
}  


//抽象命令角色  
interface Command{  
    void execute();  
}  


//具体命令类  
class ConcreteCommand implements Command{  
    private Receiver receiver;  

    public ConcreteCommand(Receiver receiver){  
        this.receiver = receiver;  
    }  

    public void execute(){  
        receiver.action();  
    }  
}  


//客户端  
public class Client{  
    public static void main(String[] args){  
        //客户端建立命令接受者
        Receiver receiver = new Receiver();  
        //客户端建立具体命令,并指定命令接受者
        Command command = new ConcreteCommand(receiver);  
        //客户端建立请求者,并给请求者指定具体命令
        Invoker invoker = new Invoker(command);  
        //命令请求者发出命令请求
        invoker.action();         
    }  
}


Command命令设计模式的优缺点: code

优势: 解耦了命令请求者和接受者之间联系。请求者调用一个命令,接受者接受请求并执行相应的动做,由于使用Command模式解耦,请求者无需知道接受者任何接口。

缺点: 形成出现过多的具体命令类。 对象

JDK中命令模式的应用: 接口

java.lang.Runnable
javax.swing.Action