07/09/2018, 18:14

Adapter (Structural Patterns)

Chuyển đổi interface của một class thành interface khác mà khách hàng mong đợi. Adapter cho phép các class làm việc với nhau mà không thể khác vì các interface không tương thích. Các thành phần tham gia pattern này gồm có: Client -- In sample code: the run() function. gọi đến Adapter ...

Chuyển đổi interface của một class thành interface khác mà khách hàng mong đợi. Adapter cho phép các class làm việc với nhau mà không thể khác vì các interface không tương thích.

Các thành phần tham gia pattern này gồm có:

  • Client -- In sample code: the run() function.
    • gọi đến Adapter để request 1 service
  • Adapter -- In sample code: ShippingAdapter
    • vận hành interface mà khách hàng mong muốn
  • Adaptee -- In sample code: AdvancedShipping
    • đối tượng đang được điều chỉnh
    • có 1 interface khác so với cái mà khách hàng mong muốn
// old interface
 
function Shipping() {
    this.request = function(zipStart, zipEnd, weight) {
        // ...
        return "$49.75";
    }
}
 
// new interface
 
function AdvancedShipping() {
    this.login = function(credentials) { /* ... */ };
    this.setStart = function(start) { /* ... */ };
    this.setDestination = function(destination) { /* ... */ };
    this.calculate = function(weight) { return "$39.50"; };
}
 
// adapter interface
 
function ShippingAdapter(credentials) {
    var shipping = new AdvancedShipping();
 
    shipping.login(credentials);
 
    return {
        request: function(zipStart, zipEnd, weight) {
            shipping.setStart(zipStart);
            shipping.setDestination(zipEnd);
            return shipping.calculate(weight);
        }
    };
}
 
// log helper
 
var log = (function () {
    var log = "";
 
    return {
        add: function (msg) { log += msg + "
"; },
        show: function () { alert(log); log = ""; }
    }
})();
 
function run() {
    var shipping = new Shipping();
    var credentials = {token: "30a8-6ee1"};
    var adapter = new ShippingAdapter(credentials);
 
    // original shipping object and interface
 
    var cost = shipping.request("78701", "10010", "2 lbs");
    log.add("Old cost: " + cost);
 
    // new shipping object with adapted interface
 
    cost = adapter.request("78701", "10010", "2 lbs");
 
    log.add("New cost: " + cost);
    log.show();
}

http://www.dofactory.com/javascript/adapter-design-pattern

0