iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

邁向 JavaScript 核心之路 系列 第 25

[Day 25] JavaScript 設計模式- 裝飾者模式、策略模式、外觀模式

  • 分享至 

  • xImage
  •  

裝飾者模式 ( Decorator )

裝飾者模式的概念是在物件上動態的加上功能來強化目標,所以在設計時,必須注意要設計的容易被強化。
是透過覆寫的方法來強化功能,所以這樣的做法會比產生子類別更靈活。


    function Computer() {
        this.price = function() {
            return 30000;
        };
    }
    function addMemory(pc) { //Decorator 1 - 增加記憶體需 $1000
        var price = pc.price();
        pc.price = function() {
            return price + 1000;
        };
    }
    function addEngraving(pc) { //Decorator 2 - 增加作業系統 $2000
        var price = pc.price();
        pc.price = function() {
            return price + 2000;
        };
    }
    function addInsurance(pc) { //Decorator 3 - 增加保固需 $3900
        var price = pc.price();
        pc.price = function() {
            return price + 3900;
        };
    }
    var mb = new Computer();
    
    //增加記憶體、刻字、保固
    addMemory(mb);
    addEngraving(mb);
    addInsurance(mb);
    
    console.log(mb.price());// 36900
    

概念類似生活中我們們會替手機購買相關配件,例如保護貼、包膜、皮套等,目的就是要保護手機外觀不受傷。

優點

  • 提供比繼承更多的靈活性。

缺點

  • 進行系統設計的時候會產生很多小對象。
  • 靈活的特性,也代表比繼承容易出錯,除錯也比較困難。

策略模式 ( Strategy )

策略模式在可執行時期,依照不同情況選擇不同的策略方式。
基本上使用相同的操作介面,但是可依照不同的程式來運作。


    // 資料

    var data = {
        name: "Reynold",
        message: "I am handsome boy!"
    };
    
    // 核心物件,利用建構式置入策略
    
    function Sender(strategy) {
        this.strategy = strategy;
    };
    
    // 核心方法
    
    Sender.prototype.send = function(data) {
        return this.strategy.send(data);
    };
    
    // 訂定策略
    
    var xmlStrategy = {
        send: function(data) {
            var str = "<xml><name>" + data.name + "</name><message>" + data.message + "</message></xml>";
            return str;
        }
    };
    
    // 訂定策略
    
    var jsonStrategy = {
        send: function(data) {
            var str = JSON.stringify(data);
            return str;
        }
    };
    
    var sender = new Sender(xmlStrategy);
    var result = sender.send(data);
    
    console.log(result);

生活中通勤有許多策略,例如走路、搭公車、搭捷運、開車、搭計程車等等,因應不同的狀況可以使用不同的策略。

優點

  • 可以靈活的替換不同的策略
  • 新增策略較容易。

缺點

  • 需自行決定使用哪種策略
  • 可能產生很多策略類

外觀模式 ( Facade )

外觀模式經常在軟體工程中使用,為子系統中的一組介面提供一個統一的高層介面,使得子系統更易用,簡化複雜的操作過程。


    var cpu = {
        execute: function() {
            console.log("execute");
        }
    };
    
    var memory = {
        load: function() {
            console.log("load");
        }
    };
    
    var hdd = {
        write: function() {
            console.log("write");
        }
    };
    
    var computer = {
        work: function() {
            memory.load();
            cpu.execute();
            hdd.write();
        }
    };
    
    var user = {
        main: function() {
            computer.work(1);
            computer.work(2);
        }
    }
    
    user.main();
    

生活中透過電腦公司買新電腦,只需要告訴他們需求,再由他們幫忙組裝完成。

優點

  • 對使用者隱藏子系統組件,減少了客戶處理的對像數目並使得子系統使用起來更加容易。
  • 降低了組件與使用者之間的耦合關係,使組件變化不會影響到調用它的程式,只需要調整外觀即可。

缺點

  • 不能很好地限制使用者使用子系統類,如果對使用者訪問子系統類做太多的限制則減少了可變性和靈活性。
  • 靈活的特性,也代表比繼承容易出錯,除錯也比較困難。

今天這的是塞車塞到懷疑人生 XDD,在車上構想鐵人賽,想完了還在塞 囧

參考資料:

Tommy - 深入 JavaScript 核心課程

Design Pattern


上一篇
[Day 24] JavaScript 設計模式- 單體模式、簡單工廠模式、迭代器模式
下一篇
[Day 26] JavaScript 設計模式- 代理模式、中介者模式、觀察者模式
系列文
邁向 JavaScript 核心之路 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言