《大話設(shè)計(jì)模式》閱讀筆記和總結(jié)。原書(shū)是C#編寫的晕拆,本人用Java實(shí)現(xiàn)了一遍,包括每種設(shè)計(jì)模式的UML圖實(shí)現(xiàn)和示例代碼實(shí)現(xiàn)。
目錄:設(shè)計(jì)模式
Github地址:DesignPattern
說(shuō)明
定義:命令模式(Command)柬批,將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象啸澡,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志氮帐,以及支持可撤銷的操作嗅虏。
UML圖:
代碼實(shí)現(xiàn):
Command類,用來(lái)聲明執(zhí)行操作的接口
/**
* Command類上沐,用來(lái)聲明執(zhí)行操作的接口
*/
abstract class Command{
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void Execute();
}
ConcreteCommand類皮服,將一個(gè)接收者對(duì)象綁定與一個(gè)動(dòng)作,調(diào)用接收者相應(yīng)的操作参咙,以實(shí)現(xiàn)Excute
class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
Invoker類龄广,要求該命令執(zhí)行這個(gè)請(qǐng)求
class Invoker{
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void excuteCommand(){
command.Execute();
}
}
Receiver類,知道如何實(shí)施與執(zhí)行一個(gè)與請(qǐng)求相關(guān)的操作蕴侧,任何類都可能作為一個(gè)接收者
class Receiver{
public void Action(){
System.out.println("執(zhí)行請(qǐng)求");
}
}
客戶端代碼
public class CommandPattern {
public static void main(String[] args){
Receiver r = new Receiver();
Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.setCommand(c);
i.excuteCommand();
}
}
運(yùn)行結(jié)果
執(zhí)行請(qǐng)求
示例
例子:夏天我們吃燒烤的時(shí)候都是燒烤店提前準(zhǔn)備好串择同,然后由燒烤師傅來(lái)烤制。我們通過(guò)服務(wù)員點(diǎn)餐戈盈,由服務(wù)員告訴燒烤師傅所點(diǎn)的菜奠衔。我們也可以通過(guò)服務(wù)員知道哪些菜沒(méi)有了。用程序模擬這個(gè)過(guò)程塘娶。
代碼實(shí)現(xiàn):
烤肉串者
public class Barbecuer {
public void BakeMutton(){
System.out.println("烤羊肉串");
}
public void BakeChickenWing(){
System.out.println("烤雞翅");
}
}
抽象命令類
public abstract class BarbecuerCommand {
protected Barbecuer receiver;
public BarbecuerCommand(Barbecuer receiver){
this.receiver =receiver;
}
public abstract void ExcuteCommand();
}
具體命令-烤羊肉串命令
public class BakeMuttonCommand extends BarbecuerCommand {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.BakeMutton();
}
}
具體命令-烤雞翅命令
public class BakeChickenWingCommand extends BarbecuerCommand {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.BakeChickenWing();
}
}
服務(wù)員類
public class Waiter {
private List<BarbecuerCommand> orders = new ArrayList<>();
//設(shè)置訂單
public void setOrder(BarbecuerCommand command){
if (command instanceof BakeChickenWingCommand){
System.out.println("服務(wù)員:雞翅沒(méi)有了归斤,請(qǐng)點(diǎn)其他的");
}else {
orders.add(command);
System.out.println("增加訂單:羊肉串");
}
}
// 取消訂單
public void cancelOrder(BarbecuerCommand command){
orders.remove(command);
}
// 通知全部執(zhí)行
public void Notify(){
for (int i = 0; i < orders.size(); i++) {
orders.get(i).ExcuteCommand();
}
}
}
客戶端代碼
public class Main {
public static void main(String[] args){
//開(kāi)店前準(zhǔn)備
Barbecuer boy = new Barbecuer();
BarbecuerCommand bakeMuttonCommand1 = new BakeMuttonCommand(boy);
BarbecuerCommand bakeMuttonCommand2 = new BakeMuttonCommand(boy);
BarbecuerCommand bakeChickenWingCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();
// 開(kāi)門營(yíng)業(yè)
girl.setOrder(bakeMuttonCommand1);
girl.setOrder(bakeMuttonCommand2);
girl.setOrder(bakeChickenWingCommand);
// 點(diǎn)菜完畢,通知廚房
girl.Notify();
}
}
運(yùn)行結(jié)果
增加訂單:羊肉串
增加訂單:羊肉串
服務(wù)員:雞翅沒(méi)有了刁岸,請(qǐng)點(diǎn)其他的
烤羊肉串
烤羊肉串