激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - 解析Java設計模式編程中命令模式的使用

解析Java設計模式編程中命令模式的使用

2020-03-31 13:02卡奴達摩 JAVA教程

這篇文章主要介紹了Java設計模式編程中命令模式的使用,在一些處理請求響應的場合經常可以用到命令模式的編程思路,需要的朋友可以參考下

定義:將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。
類型:行為類模式
類圖:

解析Java設計模式編程中命令模式的使用

命令模式的結構
        顧名思義,命令模式就是對命令的封裝,首先來看一下命令模式類圖中的基本結構:
Command類:是一個抽象類,類中對需要執行的命令進行聲明,一般來說要對外公布一個execute方法用來執行命令。
ConcreteCommand類:Command類的實現類,對抽象類中聲明的方法進行實現。
Client類:最終的客戶端調用類。
        以上三個類的作用應該是比較好理解的,下面我們重點說一下Invoker類和Recevier類。
Invoker類:調用者,負責調用命令。
Receiver類:接收者,負責接收命令并且執行命令。
        所謂對命令的封裝,說白了,無非就是把一系列的操作寫到一個方法中,然后供客戶端調用就行了,反映到類圖上,只需要一個ConcreteCommand類和Client類就可以完成對命令的封裝,即使再進一步,為了增加靈活性,可以再增加一個Command類進行適當地抽象,這個調用者和接收者到底是什么作用呢?
        其實大家可以換一個角度去想:假如僅僅是簡單地把一些操作封裝起來作為一條命令供別人調用,怎么能稱為一種模式呢?命令模式作為一種行為類模式,首先要做到低耦合,耦合度低了才能提高靈活性,而加入調用者和接收者兩個角色的目的也正是為此。
例子:
模擬對電視機的操作有開機、關機、換臺命令。代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//執行命令的接口
public interface Command {
  void execute();
}
 
//命令接收者Receiver
public class Tv {
  public int currentChannel = 0;
 
  public void turnOn() {
    System.out.println("The televisino is on.");
  }
 
  public void turnOff() {
    System.out.println("The television is off.");
  }
 
  public void changeChannel(int channel) {
    this.currentChannel = channel;
    System.out.println("Now TV channel is " + channel);
  }
}
 
//開機命令ConcreteCommand
public class CommandOn implements Command {
  private Tv myTv;
 
  public CommandOn(Tv tv) {
    myTv = tv;
  }
 
  public void execute() {
    myTv.turnOn();
  }
}
 
//關機命令ConcreteCommand
public class CommandOff implements Command {
  private Tv myTv;
 
  public CommandOff(Tv tv) {
    myTv = tv;
  }
 
  public void execute() {
    myTv.turnOff();
  }
}
 
//頻道切換命令ConcreteCommand
public class CommandChange implements Command {
  private Tv myTv;
 
  private int channel;
 
  public CommandChange(Tv tv, int channel) {
    myTv = tv;
    this.channel = channel;
  }
 
  public void execute() {
    myTv.changeChannel(channel);
  }
}
 
//可以看作是遙控器Invoker
public class Control {
  private Command onCommand, offCommand, changeChannel;
 
  public Control(Command on, Command off, Command channel) {
    onCommand = on;
    offCommand = off;
    changeChannel = channel;
  }
 
  public void turnOn() {
    onCommand.execute();
  }
 
  public void turnOff() {
    offCommand.execute();
  }
 
  public void changeChannel() {
    changeChannel.execute();
  }
}
 
//測試類Client
public class Client {
  public static void main(String[] args) {
    // 命令接收者Receiver
    Tv myTv = new Tv();
    // 開機命令ConcreteCommond
    CommandOn on = new CommandOn(myTv);
    // 關機命令ConcreteCommond
    CommandOff off = new CommandOff(myTv);
    // 頻道切換命令ConcreteCommond
    CommandChange channel = new CommandChange(myTv, 2);
    // 命令控制對象Invoker
    Control control = new Control(on, off, channel);
 
    // 開機
    control.turnOn();
    // 切換頻道
    control.changeChannel();
    // 關機
    control.turnOff();
  }
}

執行結果

?
1
2
3
The televisino is on.
Now TV channel is 2
The television is off.

命令模式的優缺點
        首先,命令模式的封裝性很好:每個命令都被封裝起來,對于客戶端來說,需要什么功能就去調用相應的命令,而無需知道命令具體是怎么執行的。比如有一組文件操作的命令:新建文件、復制文件、刪除文件。如果把這三個操作都封裝成一個命令類,客戶端只需要知道有這三個命令類即可,至于命令類中封裝好的邏輯,客戶端則無需知道。
        其次,命令模式的擴展性很好,在命令模式中,在接收者類中一般會對操作進行最基本的封裝,命令類則通過對這些基本的操作進行二次封裝,當增加新命令的時候,對命令類的編寫一般不是從零開始的,有大量的接收者類可供調用,也有大量的命令類可供調用,代碼的復用性很好。比如,文件的操作中,我們需要增加一個剪切文件的命令,則只需要把復制文件和刪除文件這兩個命令組合一下就行了,非常方便。
        最后說一下命令模式的缺點,那就是命令如果很多,開發起來就要頭疼了。特別是很多簡單的命令,實現起來就幾行代碼的事,而使用命令模式的話,不用管命令多簡單,都需要寫一個命令類來封裝。
 
命令模式的適用場景

       對于大多數請求-響應模式的功能,比較適合使用命令模式,正如命令模式定義說的那樣,命令模式對實現記錄日志、撤銷操作等功能比較方便。
 
 總結

       對于一個場合到底用不用模式,這對所有的開發人員來說都是一個很糾結的問題。有時候,因為預見到需求上會發生的某些變化,為了系統的靈活性和可擴展性而使用了某種設計模式,但這個預見的需求偏偏沒有,相反,沒預見到的需求倒是來了不少,導致在修改代碼的時候,使用的設計模式反而起了相反的作用,以至于整個項目組怨聲載道。這樣的例子,我相信每個程序設計者都遇到過。所以,基于敏捷開發的原則,我們在設計程序的時候,如果按照目前的需求,不使用某種模式也能很好地解決,那么我們就不要引入它,因為要引入一種設計模式并不困難,我們大可以在真正需要用到的時候再對系統進行一下,引入這個設計模式。
       拿命令模式來說吧,我們開發中,請求-響應模式的功能非常常見,一般來說,我們會把對請求的響應操作封裝到一個方法中,這個封裝的方法可以稱之為命令,但不是命令模式。到底要不要把這種設計上升到模式的高度就要另行考慮了,因為,如果使用命令模式,就要引入調用者、接收者兩個角色,原本放在一處的邏輯分散到了三個類中,設計時,必須考慮這樣的代價是否值得。

延伸 · 閱讀

精彩推薦
630
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 免费国产一区二区视频 | 大学生a级毛片免费视频 | 欧美黄色一级生活片 | 欧美久久久久久久久 | 亚洲卡通动漫在线观看 | 欧美成人精品一级 | 黄网站免费在线看 | 免费国产视频在线观看 | 日韩视频在线一区二区三区 | 欧美a黄 | 主人在调教室性调教女仆游戏 | 精品亚洲网站 | 国产成人高清成人av片在线看 | 久久久久99精品 | 久久久久国产成人精品亚洲午夜 | 成人免费电影在线观看 | 亚洲一区中文字幕 | 精品一二三区视频 | 亚洲午夜久久久久 | 欧美激情猛片xxxⅹ大3 | 蜜桃一本色道久久综合亚洲精品冫 | 亚洲日本韩国精品 | 99精品在线免费 | 久久在线免费视频 | 黄色片网站免费在线观看 | 本站只有精品 | 亚洲成人精品视频 | 久久精品亚洲一区二区三区观看模式 | 精品一区二区三区在线观看视频 | 黄色网址免费进入 | 欧美一级片一区 | 精品国产一区二区三区四 | 综合网天天色 | 国产一区网址 | 正在播放91| 亚洲看片网 | www.三区| 一区二区三区欧美精品 | 色婷婷a v | 免费视频爱爱太爽了 | 美女亚洲 |