解析Java設計形式編程中敕令形式的應用。本站提示廣大學習愛好者:(解析Java設計形式編程中敕令形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Java設計形式編程中敕令形式的應用正文
界說:將一個要求封裝成一個對象,從而讓你應用分歧的要求把客戶端參數化,對要求列隊或許記載要求日記,可以供給敕令的撤消和恢復功效。
類型:行動類形式
類圖:
敕令形式的構造
望文生義,敕令形式就是對敕令的封裝,起首來看一下敕令形式類圖中的根本構造:
Command類:是一個籠統類,類中對須要履行的敕令停止聲明,普通來講要對外頒布一個execute辦法用來履行敕令。
ConcreteCommand類:Command類的完成類,對籠統類中聲明的辦法停止完成。
Client類:終究的客戶端挪用類。
以上三個類的感化應當是比擬好懂得的,上面我們重點說一下Invoker類和Recevier類。
Invoker類:挪用者,擔任挪用敕令。
Receiver類:吸收者,擔任吸收敕令而且履行敕令。
所謂對敕令的封裝,說白了,不過就是把一系列的操作寫到一個辦法中,然後供客戶端挪用就好了,反應到類圖上,只須要一個ConcreteCommand類和Client類便可以完成對敕令的封裝,即便再進一步,為了增長靈巧性,可以再增長一個Command類停止恰當地籠統,這個挪用者和吸收者究竟是甚麼感化呢?
其實年夜家可以換一個角度去想:假設僅僅是簡略地把一些操作封裝起來作為一條敕令供他人挪用,怎樣能稱為一種形式呢?敕令形式作為一種行動類形式,起首要做到低耦合,耦合度低了能力進步靈巧性,而參加挪用者和吸收者兩個腳色的目標也恰是為此。
例子:
模仿對電視機的操作有開機、關機、換台敕令。代碼以下
//履行敕令的接口 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(); } }
履行成果
The televisino is on. Now TV channel is 2 The television is off.
敕令形式的優缺陷
起首,敕令形式的封裝性很好:每一個敕令都被封裝起來,關於客戶端來講,須要甚麼功效就去挪用響應的敕令,而無需曉得敕令詳細是怎樣履行的。好比有一組文件操作的敕令:新建文件、復制文件、刪除文件。假如把這三個操作都封裝成一個敕令類,客戶端只須要曉得有這三個敕令類便可,至於敕令類中封裝好的邏輯,客戶端則無需曉得。
其次,敕令形式的擴大性很好,在敕令形式中,在吸收者類中普通會對操作停止最根本的封裝,敕令類則經由過程對這些根本的操作停止二次封裝,當增長新敕令的時刻,對敕令類的編寫普通不是從零開端的,有年夜量的吸收者類可供挪用,也有年夜量的敕令類可供挪用,代碼的復用性很好。好比,文件的操作中,我們須要增長一個剪切文件的敕令,則只須要把復制文件和刪除文件這兩個敕令組合一下就好了,異常便利。
最初說一下敕令形式的缺陷,那就是敕令假如許多,開辟起來就要頭疼了。特殊是許多簡略的敕令,完成起來就幾行代碼的事,而應用敕令形式的話,不消管敕令多簡略,都須要寫一個敕令類來封裝。
敕令形式的實用場景
關於年夜多半要求-呼應形式的功效,比擬合適應用敕令形式,正如敕令形式界說說的那樣,敕令形式對完成記載日記、撤消操作等功效比擬便利。
總結
關於一個場所究竟用不消形式,這對一切的開辟人員來講都是一個很糾結的成績。有時刻,由於預感到需求上會產生的某些變更,為了體系的靈巧性和可擴大性而應用了某種設計形式,但這個預感的需求恰恰沒有,相反,沒預感到的需求卻是來了很多,招致在修正代碼的時刻,應用的設計形式反而起了相反的感化,以致於全部項目組怨聲載道。如許的例子,我信任每一個法式設計者都碰到過。所以,基於迅速開辟的准繩,我們在設計法式的時刻,假如依照今朝的需求,不應用某種形式也能很好地處理,那末我們就不要引入它,由於要引入一種設計形式其實不艱苦,我們年夜可以在真正須要用到的時刻再對體系停止一下,引入這個設計形式。
拿敕令形式來講吧,我們開辟中,要求-呼應形式的功效異常罕見,普通來講,我們會把對要求的呼應操作封裝到一個辦法中,這個封裝的辦法可以稱之為敕令,但不是敕令形式。究竟要不要把這類設計上升到形式的高度就要另行斟酌了,由於,假如應用敕令形式,就要引入挪用者、吸收者兩個腳色,本來放在一處的邏輯疏散到了三個類中,設計時,必需斟酌如許的價值能否值得。