Java 設計模式(一) 命令模式

代碼不是看出來的,而是敲出來的,歡迎關注WX公眾號【禿頭程序員】,收藏教程。

設計模式的提法最早起源於建築學,隨後在軟件領域由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合作出版的《設計模式:可複用的面向對象軟件的基礎》,正式掀開了軟件業設計模式的序幕,該書被廣大喜愛者暱稱為GOF(Gang of Four)之書,被認為是學習設計模式的必讀著作。

而我們學習設計模式的目的是什麼,學習設計模式會對我們的應聘面試、開發編程起到多大幫助作用。設計模式的作用在於幫助我們將應用組織成容易瞭解,容易維護,具有彈性的架構,建立可維護的OO(Object Oriented面向對象)系統,要訣在於隨時想到系統以後可能需要的變化以及應付變化的原則。

1、設計模式能讓專業人之間交流方便,如下:

程序員A:這裡我用了XXX設計模式

程序員B:那我大致瞭解你程序的設計思路了

2、易維護

項目經理:今天客戶有這樣一個需求…

程序員:明白了,這裡我使用了XXX設計模式,所以改起來很快

3、設計模式是編程經驗的總結

程序員A:B,你怎麼想到要這樣去構建你的代碼

程序員B:在我學習了XXX設計模式之後,好像自然而然就感覺這樣寫能避免一些問題

4、學習設計模式並不是必須的

程序員A:B,你這段代碼使用的是XXX設計模式對嗎?

程序員B:不好意思,我沒有學習過設計模式,但是我的經驗告訴我是這樣寫的

Java 中一般認為有23種設計模式,總體來說設計模式分為三大類:

創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十幾種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。今天此文禿頭程序員先介紹命令模式。

命令模式

涉及到一個對象請求另一個對象調用其方法到達某種目的。如果請求者不希望或無法直接和被請求者打交道,即不希望或無法含有被請求者的引用,那麼就可以使用命令模式。

在面向對象的程序設計中,一個對象調用另一個對象,一般情況下的調用過程是:創建目標對象實例;設置調用參數;調用目標對象的方法。但在有些情況下有必要使用一個專門的類對這種調用過程加以封裝,我們把這種專門的類稱作command類。

命令模式的結構中包括四種角色:

  • 接收者(Receiver)
  • 命令(Command)接口
  • 具體命令(ConcreteCommand)
  • 請求者(Invoker)

模式的UML類圖如下:

Java 設計模式(一) 命令模式

<code>1.接收者(Receiver) : CompanyStudent.java
public class CompanyStudent{
public void doWork(){
System.out.println("我會完成作業");
}
}/<code>
<code>2.命令(Command)接口 : Command.java
public interface Command {
public abstract void execute();
}/<code>
<code>3.具體命令(ConcreteCommand) ConcreteCommand.java 
public class ConcreteCommand implements Command{
CompanyStudent student; //含有接收者的引用
ConcreteCommand(CompanyStudent student){
this.student=student;
}
public void execute(){ //封裝著老師的請求
student.doWork(); //做作業
}
}/<code>
<code>4.請求者(Invoker) Teacher.java 
public class Teacher{
Command command; //用來存放具體命令的引用
public void setCommand(Command command){
this.command=command;
}
public void startExecuteCommand(){ //讓具體命令執行execute()方法
command.execute();
}
}/<code>
<code>5.應用 Application.java
public class Application{
public static void main(String args[]){
CompanyStudent bill=new CompanyStudent();
Command command=new ConcreteCommand(bill);
teacher lisa=new teacher();
lisa.setCommand(command);
lisa.startExecuteCommand();

}
}/<code>

適合使用命令模式的情景:程序需要在不同的時刻指定、排列和執行請求;程序需要提供撤銷操作;程序需要支持宏操作。

通過對上面的分析我們可以知道如下幾點:

1. 命令模式是通過命令發送者和命令執行者的解耦來完成對命令的具體控制的。

2. 命令模式是對功能方法的抽象,並不是對對象的抽象。

3. 命令模式是將功能提升到對象來操作,以便對多個功能進行一系列的處理以及封裝。

代碼不是看出來的,而是敲出來的,歡迎關注WX公眾號【禿頭程序員】,收藏教程。


分享到:


相關文章: