JavaScript設計模式-- 代理(Proxy)模式

定義: 用一個物件去做為另一個物件的介面, 這樣做的主目的是為了保護物件的存取, 避免不正確的操作行為。

看到這裡, 不知會不會和迭代器模式混淆呢?

代理模式和迭代器模式都是為了保護目標物件的資料不被更動。但是代理模式能更進一步保護物件的操作流程(因操作具有順序性), 也就是先做什麼才能後做什麼, 這也是因為我們不選擇直接使用目標物件(我們要保護的資料存在這物件中)的方法。

e.g.

var car = {                                            // 這動作有順序性: startEngine --> run --> stopEngine

    startEngine: function() { console.log("startEngine"); },
    stopEngine: function() { console.log("stopEngine"); },
    run: function() { console.log("run"); }

};

function ProxyCar(car) {

    var isStarted = false;                     // 用私有變數封裝, 防止外部修改(形成閉包)
    this.startEngine = function() {

        if (isStarted) {                             // 確認是否已有啟動引擎了(因操作具順序性)

            console.log("It is already started!");

        } else {

            car.startEngine();
            isStarted = true;

        }

    };

    this.stopEngine = function() {

        if (!isStarted) {                            // 確認是否已有關閉引擎了(因操作具順序性)

            console.log("It is already stopped!");

        } else {

            car.stopEngine();
            isStarted = false;

        }

    };

    this.run = function() {

        if (!isStarted) {                            // 確認是否已有啟動引擎了(因操作具順序性)

            console.log("You have to start the engine first!");

        } else {

            car.run();

        }

    };

}

var proxyCar = new ProxyCar(car);           // car本身是物件, 傳到proxy物件去進一步設定、操作其屬性

proxyCar.run();                                                  // You have to start the engine first!
proxyCar.stopEngine();                                   // It is already stopped!
proxyCar.startEngine();                                  // startEngine
proxyCar.run();                                                // run



p.s. 寫介面的code時, 要避免有些東西給外部修改(封裝-->不想被改就變成私有屬性和方法吧)。



留言

熱門文章