尋找哈爾濱網(wǎng)站建設(shè)市場營銷試題庫(帶答案)
19.命令模式
首先就是我們的 Client 想要實現(xiàn)一個功能,于是它就創(chuàng)建了一個 Command, 為了方便調(diào)用將 Command 封裝在了 Invoker 中,當(dāng)我們想調(diào)用的時候,Invoker 會執(zhí)行內(nèi)部 Command 提供的方法, Receiver 接收到 Command 的請求,為其提供底部支持。
多說無益,我將通過一個例子介紹命令模式。
實例
目前大部分的軟件都支持用戶自定義界面,比如說我們可以修改字體大小,背景顏色等。我們就以此為例。首先,寫出兩個類。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Font {private String fontSize = "normal";
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BackGround {private String bgColor = "default color";
}
這是 Command, 修改字體大小和背景的類都繼承于此。
public interface Command {void execute();
}
我們只是在類中獲得一個 Font 類的引用,然后調(diào)用setFontSize() 方法對字體的大小進(jìn)行設(shè)置。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LargeFontCommand implements Command {private Font font;@Overridepublic void execute() {font.setFontSize("large");}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class NormalFontCommand implements Command {private Font font;@Overridepublic void execute() {font.setFontSize("Normal");}
}
background類的引用,調(diào)背景顏色
@NoArgsConstructor
@AllArgsConstructor
@Data
public class CustomBackGround implements Command {private BackGround backGround;private String color;public CustomBackGround(BackGround backGround){this.backGround = backGround;}@Overridepublic void execute() {backGround.setBgColor("Custom background");}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DefaultBackground implements Command {private BackGround backGround;@Overridepublic void execute() {backGround.setBgColor("default color");}
}
Invoker類存放命令
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Invoker {private List<Command> commands = new ArrayList<>();public void setCommand(int i,Command command){commands.add(i,command);}public void update(int i){commands.get(i).execute();}
}
public class CommandTest {public static void main(String[] args) {Font font = new Font();BackGround backGround = new BackGround();NormalFontCommand normalFontCommand = new NormalFontCommand(font);LargeFontCommand largeFontCommand = new LargeFontCommand(font);DefaultBackground defaultBackground = new DefaultBackground(backGround);CustomBackGround customBackGround = new CustomBackGround(backGround);Invoker invoker = new Invoker();invoker.setCommand(0,normalFontCommand);invoker.setCommand(1,largeFontCommand);invoker.setCommand(2,defaultBackground);invoker.setCommand(3,customBackGround);invoker.update(3);System.out.println(backGround.getBgColor());}
}
我們首先把所有的命令添加到了 Invoker , 然后直接調(diào)用 update() 方法就可以了。
這么做有什么好處呢?看的出來,可以將很多命令放進(jìn) Invoker , 它并不知道功能是如何實現(xiàn)的,它就像一個中介, Client 請求一個功能,它就將這個請求轉(zhuǎn)給 Command 去實現(xiàn)。這種模式有很多的用途,比如說多功能遙控器,日志打印等。
還有一點不得不說的,我們可以使用宏命令,什么是宏命令呢?就是寫一個 Command ,這個 Command 可以實現(xiàn)多個功能。比如說我們可以同時修改背景和顏色。