高了應(yīng)用的靈活性。命令模式將調(diào)用的目標(biāo)對(duì)象的一些異構(gòu)性給封裝起來,通過統(tǒng)一的方式來為調(diào)用者提供服務(wù)。
適用場(chǎng)景
1、當(dāng)一個(gè)應(yīng)用程序調(diào)用者與多個(gè)目標(biāo)對(duì)象之間存在調(diào)用關(guān)系時(shí),并且目標(biāo)對(duì)象之間的操作很類似的時(shí)候。
2、例如當(dāng)一個(gè)目標(biāo)對(duì)象內(nèi)部的方法調(diào)用太復(fù)雜,或者內(nèi)部的方法需要協(xié)作才能完成對(duì)象的某個(gè)特點(diǎn)操作時(shí)。
3、有時(shí)候調(diào)用者調(diào)用目標(biāo)對(duì)象后,需要回調(diào)一些方法。
例子:
命令接口:
public interface Commond {
public void execute();
}
命令接口實(shí)現(xiàn)類:
public class LightOnCommond implements Commond{
private Light light;
public LightOnCommond(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
命令的調(diào)用者:
public class Light {
public void on() {
System.out.println("燈亮了");
}
}
public class TurnTvCommond implements Commond {
private Tv tv;
public TurnTvCommond(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turn();
}
}
public class Tv {
public void turn() {
System.out.println("調(diào)臺(tái)");
}
}
同時(shí)執(zhí)行的多個(gè)命令數(shù)組
public class MracoCommond implements Commond{
private Commond[] commonds;
public MracoCommond(Commond...commonds) {
this.commonds = commonds;
}
@Override
public void execute() {
for(Commond cmd : commonds) {
cmd.execute();
}
}
}
命令的包裝類,
public class RemoteContro {
private List<Commond> commondList = new ArrayList<Commond>();
public void setCommond(Commond commond) {
commondList.add(commond);
}
public void buttonWasPressed(int index){
commondList.get(index-1).execute();
}
}
public class Test {
public static void main(String[] args) {
Light light = new Light();
LightOnCommond loc = new LightOnCommond(light);
Tv tv = new Tv();
TurnTvCommond ttc = new TurnTvCommond(tv);
MracoCommond mc = new MracoCommond(loc,ttc);
RemoteContro rc = new RemoteContro();
rc.setCommond(ttc);
rc.setCommond(loc);
rc.setCommond(mc);
//rc.buttonWasPressed(3);
//rc.buttonWasPressed(1);
rc.buttonWasPressed(2);
}
}
當(dāng)輸入123不同時(shí),調(diào)用的命令不同,實(shí)現(xiàn)了多個(gè)命令的包裝