解析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.
敕令形式的優缺陷
起首,敕令形式的封裝性很好:每一個敕令都被封裝起來,關於客戶端來講,須要甚麼功效就去挪用響應的敕令,而無需曉得敕令詳細是怎樣履行的。好比有一組文件操作的敕令:新建文件、復制文件、刪除文件。假如把這三個操作都封裝成一個敕令類,客戶端只須要曉得有這三個敕令類便可,至於敕令類中封裝好的邏輯,客戶端則無需曉得。
其次,敕令形式的擴大性很好,在敕令形式中,在吸收者類中普通會對操作停止最根本的封裝,敕令類則經由過程對這些根本的操作停止二次封裝,當增長新敕令的時刻,對敕令類的編寫普通不是從零開端的,有年夜量的吸收者類可供挪用,也有年夜量的敕令類可供挪用,代碼的復用性很好。好比,文件的操作中,我們須要增長一個剪切文件的敕令,則只須要把復制文件和刪除文件這兩個敕令組合一下就好了,異常便利。
最初說一下敕令形式的缺陷,那就是敕令假如許多,開辟起來就要頭疼了。特殊是許多簡略的敕令,完成起來就幾行代碼的事,而應用敕令形式的話,不消管敕令多簡略,都須要寫一個敕令類來封裝。
敕令形式的實用場景
關於年夜多半要求-呼應形式的功效,比擬合適應用敕令形式,正如敕令形式界說說的那樣,敕令形式對完成記載日記、撤消操作等功效比擬便利。
總結
關於一個場所究竟用不消形式,這對一切的開辟人員來講都是一個很糾結的成績。有時刻,由於預感到需求上會產生的某些變更,為了體系的靈巧性和可擴大性而應用了某種設計形式,但這個預感的需求恰恰沒有,相反,沒預感到的需求卻是來了很多,招致在修正代碼的時刻,應用的設計形式反而起了相反的感化,以致於全部項目組怨聲載道。如許的例子,我信任每一個法式設計者都碰到過。所以,基於迅速開辟的准繩,我們在設計法式的時刻,假如依照今朝的需求,不應用某種形式也能很好地處理,那末我們就不要引入它,由於要引入一種設計形式其實不艱苦,我們年夜可以在真正須要用到的時刻再對體系停止一下,引入這個設計形式。
拿敕令形式來講吧,我們開辟中,要求-呼應形式的功效異常罕見,普通來講,我們會把對要求的呼應操作封裝到一個辦法中,這個封裝的辦法可以稱之為敕令,但不是敕令形式。究竟要不要把這類設計上升到形式的高度就要另行斟酌了,由於,假如應用敕令形式,就要引入挪用者、吸收者兩個腳色,本來放在一處的邏輯疏散到了三個類中,設計時,必需斟酌如許的價值能否值得。