目的
將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使你可使用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄日志,以及支持可撤銷(xiāo)的操作。
優(yōu)點(diǎn)
- 降低系統(tǒng)的耦合度。命令模式能將調(diào)用操作的對(duì)象與實(shí)現(xiàn)該操作的對(duì)象解耦。
- 增加或刪除命令非常方便。采用命令模式增加與刪除命令不會(huì)影響其他類(lèi),他滿(mǎn)足“開(kāi)閉原則”,比擴(kuò)展比較靈活。
- 可以實(shí)現(xiàn)宏命令。民工模式可以與組合模式結(jié)合,將多個(gè)命令裝配成一個(gè)組合命令,即宏命令。
- 方便實(shí)現(xiàn)Undo和Redo操作。命令模式可以與備忘錄模式結(jié)合,實(shí)現(xiàn)命令的撤銷(xiāo)與恢復(fù)。
使用例子
在高中的時(shí)候,小陳在暑假的時(shí)候太無(wú)聊了就去酒店做兼職。在這個(gè)情況下,于是,他就使用命令模式來(lái)點(diǎn)菜。
餐廳里面一共有兩名廚師,這是屬于類(lèi)圖里面的ConcreteReceiver,分別是中餐廚師和西餐廚師。一共由兩種菜,分別是紅燒肉和沙拉,這相當(dāng)于類(lèi)圖中的ConcreteCommand。
命令由調(diào)用cooking()函數(shù)來(lái)讓廚師做菜。
詳細(xì)代碼如下:
package command;
/**
* 廚師接口,相當(dāng)于抽象的
*/
public interface Chief {
void cooking(String name);
}
package command;
/**
* 中國(guó)廚師
*/
public class ChineseChief implements Chief {
@Override
public void cooking(String name){
System.out.println("中餐廚師開(kāi)始做" + name);
}
}
package command;
/**
* 西餐廚師
*/
public class WesternChief implements Chief {
public void cooking(String name){
System.out.println("西餐廚師開(kāi)始制作"+ name);
}
}
package command;
/**
* 食物接口
*/
public interface Food {
void cooking();
}
package command;
/**
* 紅燒肉,相當(dāng)于具體命令
*/
public class BraisedPork implements Food{
private Chief chief;
public BraisedPork(Chief chief){
this.chief = chief;
}
public void cooking(){
chief.cooking("紅燒肉");
}
}
package command;
public class Salad implements Food {
private Chief chief;
public Salad(Chief chief){
this.chief = chief;
}
public void cooking(){
chief.cooking("沙拉");
}
}
package command;
/**
* 在本類(lèi)中使用建造者模式來(lái)設(shè)定多個(gè)菜品
*/
public class Server {
String name;
Food food1,food2,food3;
private Server(Builder builder){
this.name = builder.name;
this.food1 = builder.food1;
this.food2 = builder.food2;
this.food3 = builder.food3;
}
/**
* 服務(wù)員將菜單傳遞給廚師,他是命令的調(diào)用者
*/
public void deliver(){
if (food1 != null){
food1.cooking();
}
if(food2 != null){
food2.cooking();
}
if(food3 != null){
food3.cooking();
}
}
public static class Builder{
String name;
private Food food1;
private Food food2;
private Food food3;
public Builder(String name){
this.name = name;
}
public Builder food1(Food food){
this.food1 = food;
return this;
}
public Builder food2(Food food){
this.food2 = food;
return this;
}
public Builder food3(Food food){
this.food3 = food;
return this;
}
public Server builder(){
return new Server(this);
}
}
}
package command;
public class Client {
public static void main(String[] args) {
Chief chineseChief = new ChineseChief();
Chief westernChief = new WesternChief();
Food braisePork = new BraisedPork(chineseChief);
Food salad = new Salad(westernChief);
Server server = new Server.Builder("小陳").food1(braisePork).food2(salad).builder();
server.deliver();
}
}
輸出結(jié)果如下:
中餐廚師開(kāi)始做紅燒肉
西餐廚師開(kāi)始制作沙拉