頻道欄目
首頁 > 資訊 > Java > 正文

Java設計模式之命令模式代碼實例

18-02-03        來源:[db:作者]  
收藏   我要投稿

【情景展示】

在網絡出現之前,我們的日常生活中,人與人的交際,一般使用語言溝通,然而社會在進步,隨著城市化進程的加快,我們的生活發生了巨大的變化,如今的社會,人與人之間的交流方式變得多樣化、多元化,例如:手機短信、微信、語音通信、視頻通信、電子郵件,等等。網絡拉近了人與人之間的距離,世界也因此變得越來越小,然而在交流方式增多的同時,我們會發現,其實人與人之間的語言交流變得少了,原始的東西變得少了。今天,我們重溫信紙、郵局的時代。

日常生活中的郵局,可能已經成為人們眼中的一道風景線,獲取偶爾會有銀行的信件催促你信用卡的到期還款日,現在已經很少有人使用信件交流傳遞感情。當然了,這也是社會發展的一種趨勢,網絡、即時通信有很多優勢,為我們帶來了很多便利。然而郵局作為一個發信人和收信人的中轉機構,它的作用不容小覷,省去了發信人與收信人的直接交流,為發信人和收信人傳遞信息。

郵局,充當著一個中間人的角色,為發信人和收信人之間建立起一個溝通的橋梁,彼此互通信息,而省去了發信人和收信人當面交流的麻煩。發信人不必知道郵局系統內部是如何運作的,信是如何發到收信人手中的,發信人所關注的就是把信交到郵局,然后等待收信人的回信。而收信人也不用關心郵局是如何吧信從一個地方運輸到另一個地方,然后又通過什么樣的方法找到自己,收信人關心的就是接到了發信人的信,然后回信。發信人和收信人之間就這樣在郵局的中轉中進行交流。

郵局的例子,和今天分享的命令模式很相似。命令模式就是在請求者和實現者之間增加一個中間人的角色,來達到解除耦合的目的。就像發信人和收信人不是直接聯系的,而是通過郵局進行通信聯系。

【模式定義】

命令模式(Command Pattern),將來自客戶端的請求封裝為一個對象,無須了解這個請求激活的動作或有關接受這個請求的處理細節。命令模式的根本目的在于將“請求者”與“實現者”之間解耦。其實命令模式與很多其他設計模式一樣,就是在請求者和實現者之間增加一個中間人的角色,來達到解除耦合的目的。通過對中間角色的特殊設置,從而形成不同的設計模式,命令模式也不例外。命令模式正是通過一個中間的命令者角色完成請求與實現之間的解耦。

【靜態建!

發信人 —— Invoker

郵局 —— Post

收信人 —— Receiver

發信人投遞信件給郵局,郵局接到信件將信件發給收信人,整個過程就算完成。需要注意的一點是:自始至終發信人和收信人都沒有任何的通信,也就是說,命令的調用者和命令的接受者是沒有聯系的,完全是通過中間人——郵局進行通信。

【模式實現】

工程結構圖:

1、消息接收者

1.1 創建消息接收者接口——IReceiver

package com.demo.receiver;

/**
 * 信件接收者接口
 */
public interface IReceiver {

    /**
     * 收件人收到信件讀取
     * @param message
     */
    public void readMail(String message);
}

1.2 創建消息接收者——Receiver

package com.demo.receiver;

/**
 * 信件接收者
 */
public class Receiver implements IReceiver{
    /**
     * 收件人收到信件讀取
     * @param message
     */
    public void readMail(String message){
        System.out.println("收件人讀取信件:" + message);
    }
}

2、創建中間角色郵局

2.1 郵局接口——IPost

package com.demo.command;

/**
 * 郵局接口
 */
public interface IPost {
    /**
     * 郵局發送信件
     * @param message
     */
    public void sendMail(String message);
}

2.2 郵局實現,依賴消息接收者接口——Post

package com.demo.command;

import com.demo.receiver.IReceiver;

/**
 * 郵局實現類
 */
public class Post implements IPost {

    //收件人對象實例
    private final IReceiver receiver;

    /**
     * 構造方法傳入收信人對象實例
     * @param receiver
     */
    public Post(IReceiver receiver){
        this.receiver = receiver;
    }

    /**
     * 郵局發送信件
     * @param message
     */
    @Override
    public void sendMail(String message) {
        System.out.println("郵局將信件發給收件人……");
        //郵局發送信件給收信人
        this.receiver.readMail(message);
    }
}

3、消息發送者——Invoker

package com.demo.invoker;

import com.demo.command.IPost;

/**
 * 發信人
 */
public class Invoker {
    //郵局私有屬性
    private IPost post;

    /**
     * 設置郵局對象實例
     * @param post
     */
    public void setPost(IPost post){
        this.post = post;
    }

    /**
     * 發信人發送信件
     * @param message
     */
    public void postMail(String message){
        System.out.println("發信人投遞郵件給郵局……");
        this.post.sendMail(message);
    }
}

4、讓郵局開始工作——Client

package com.demo;

import com.demo.command.IPost;
import com.demo.command.Post;
import com.demo.invoker.Invoker;
import com.demo.receiver.Receiver;

/**
 * 客戶端應用程序
 */
public class Client {
    public static void main(String[] args){
       //創建一個收信人對象實例
        Receiver receiver = new Receiver();
        //創建一個郵局對象實例,傳入收信人對象實例
        IPost post = new Post(receiver);
        //創建一個發信人對象實例,傳入郵局對象實例
        Invoker invoker = new Invoker();
        //設置郵局
        invoker.setPost(post);
        //發信人開始發送信息!
        invoker.postMail("你好!好久不見,最近工作忙嗎?");
    }
}

5、運行效果

【小結】

1、命令模式

命令模式將一個請求封裝為一個對象,從而使用戶可用不同的請求對客戶進行參數化;將請求排隊或記錄請求日志,支持可撤銷的操作。命令模式的根本目的在于將“請求者”與“實現者”之間解耦。

2、設計原則

(1)“開—閉”原則:命令模式如果新增加一個具體的命令,不必修改請求的調用者,調用者就能使用具體命令,發送請求。如果新增加一個具體的命令,也不必修改具體的命令和命令接收者,新增的調用者就會使用已有的具體命令。

(2)最少知識原則:在命令模式中,請求的啟動者發送命令請求給具體命令,由具體命令負責發送命令消息給命令的接收者。

3、相關的設計模式

(1)組合模式:在使用宏命令時,我們會用到組合模式。

(2)備忘錄模式:可以用來存儲命令的效果狀態信息,用于命令的撤銷和恢復功能。

(3)原型模式:可以使用原型模式(實現Cloneable接口)來負責命令。

4、使用場合

(1)抽象出待執行的動作以參數化某對象。類似過程設計中的回調機制,而命令模式正式回調機制的一個面向對象的替代品。

(2)在不同的時刻指定、排列和執行請求

(3)需要支持可撤銷的操作

(4)需要支持修改日志功能。這樣當系統崩潰時,這些修改可以被重做一遍。

(5)需要支持事物系統。

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片