你是不是把網上那些命令模式看膩了,千篇一律的抄襲,那個類圖不知道是那裏畫的,明明都錯了,那麼多人貼上來,代碼也直接copy過來。。。我已經無力吐槽了。
我根據自己想法寫TV的命令模式例子
乾貨,上代碼
//電視表示接收者類
class TV{
private int currentChannel=0,lastChannel=0;
public void turnon(){
System.out.println("TV ON " + currentChannel);
}
public void turnoff(){
System.out.println("TV OFF");
lastChannel=currentChannel;
currentChannel=0;
}
public void turnChanle(int to){
System.out.println("change channel from "+currentChannel+" to "+ to);
lastChannel=currentChannel ;
currentChannel = to;
}
public void undo(){
turnChanle(lastChannel);
}
}
//抽象的命令類,不同於其他地方說的Command接口 , 感覺可以寫一個Commad接口只包含execute方法,然後用TVCommand實現它,有興趣的可以試試
abstract class TVCommand{
protected TV tv;
public abstract void execute();
}
//一下都是具體的命令類
class TurnOnConcreteTVcommand extends TVCommand{
@Override
public void execute() {
tv.turnon();
}
public TurnOnConcreteTVcommand(TV tv){
this.tv = tv;
}
}
class TurnOffConcreteTVcommand extends TVCommand{
@Override
public void execute() {
tv.turnoff();
}
public TurnOffConcreteTVcommand(TV tv){
this.tv = tv;
}
}
class TurnChannelConcreteTVcommand extends TVCommand{
protected int tochannel;
@Override
public void execute() {
tv.turnChanle(tochannel);
}
public void setTochannel(int tochannel) {
this.tochannel = tochannel;
}
public TurnChannelConcreteTVcommand(TV tv){
this.tv = tv;
}
}
class UndoConcreteTVcommand extends TVCommand{
@Override
public void execute() {
tv.undo();
}
public UndoConcreteTVcommand(TV tv){
this.tv = tv;
}
}
// 遙控器 調用者,和用戶交互的接口
class ControlPanel{
private ArrayList<TVCommand> commandArryList = new ArrayList<>();
public void turnon(){
boolean flag= false;
for (TVCommand command :commandArryList){
if (command instanceof TurnOnConcreteTVcommand){
command.execute();
flag=true;
break;
}
}
if (!flag){
alert();
}
}
public void turnoff(){
boolean flag= false;
for (TVCommand command :commandArryList){
if (command instanceof TurnOffConcreteTVcommand){
command.execute();
flag=true;
break;
}
}
if (!flag){
alert();
}
}
public void turnChannel(int to){
boolean flag= false;
for (TVCommand command :commandArryList){
if (command instanceof TurnChannelConcreteTVcommand){
TurnChannelConcreteTVcommand turnChannelConcreteTVcommand = (TurnChannelConcreteTVcommand) command;
turnChannelConcreteTVcommand.setTochannel(to);
turnChannelConcreteTVcommand.execute();
flag=true;
break;
}
}
if (!flag){
alert();
}
}
public void undo(){
boolean flag =false;
for (TVCommand command :commandArryList){
if (command instanceof UndoConcreteTVcommand){
command.execute();
flag=true;
break;
}
}
if (!flag){
alert();
}
}
public void addCommand(TVCommand command){
commandArryList.add(command);
}
private void alert(){
System.out.println("此遙控板不支持此功能");
}
}
class Client1{
public static void main(String[] args) {
//電視
TV tv = new TV();
//具體的命令
TVCommand onCommand = new TurnOnConcreteTVcommand(tv);
TVCommand offCommand = new TurnOffConcreteTVcommand(tv);
TVCommand turnChannelCommand = new TurnChannelConcreteTVcommand(tv);
TVCommand undoCommand = new UndoConcreteTVcommand(tv);
//將命令加入到遙控器上,相當於所有的命令組合在一起形成了一個遙控器
ControlPanel controlPanel = new ControlPanel();
controlPanel.addCommand(onCommand);
controlPanel.addCommand(offCommand);
controlPanel.addCommand(turnChannelCommand);
//controlPanel.addCommand(undoCommand);
//直接點擊遙控器上的按鈕
controlPanel.turnon();
//具體的點擊的時候才選擇切換到 XX 頻道
controlPanel.turnChannel(20);
controlPanel.turnChannel(30);
controlPanel.turnChannel(40);
controlPanel.undo();
controlPanel.turnoff();
controlPanel.turnon();
}
在Invoker類上,我寫了很多操作,我不知道這樣是對是錯,歡迎指正!