วันพฤหัสบดีที่ 7 มีนาคม พ.ศ. 2556

Delegation pattern and Facade pattern ( façade pattern )

Delegate ( เป็น Adapter แบบหนึ่ง )

delegate เขาบอกว่า ส่วนใหญ่จะใช้เป็น middle tier เพื่อลด coupling ระหว่าง presentation tier กับ business logic tier

จากตัวอย่าง โลกภายนอก จะเห็น Printer แต่จริงๆ แล้ว Real Printer เป็นคนทำงาน

Basic example
class RealPrinter { // the "delegate"
     void print() { 
       System.out.println("something"); 
     }
 }
 
 class Printer { // the "delegator"
     RealPrinter p = new RealPrinter(); // create the delegate 
     void print() { 
       p.print(); // delegation
     } 
 }
 
 public class Main {
     // to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
         Printer printer = new Printer();
         printer.print();
     }
 }

ข้อดีของการใช้ delegate กับ interface คือ flexible and typesafe.
- Flexibility
   Class C มี methods เพื่อเปลี่ยนเป็น classes A and B
- typesafe
   การเพิ่ม implements clauses ช่วยทำให้ type safe, เพราะ แต่ละ class ต้อง implement methods ของ interface
ข้อเสีย คือ ต้อง code มากขึ้น

More complex example
interface I {
    void f();
    void g();
}
 
class A implements I {
    public void f() { System.out.println("A: doing f()"); }
    public void g() { System.out.println("A: doing g()"); }
}
 
class B implements I {
    public void f() { System.out.println("B: doing f()"); }
    public void g() { System.out.println("B: doing g()"); }
}
 
class C implements I {
    // delegation
    I i = new A();
 
    public void f() { i.f(); }
    public void g() { i.g(); }
 
    // normal attributes
    public void toA() { i = new A(); }
    public void toB() { i = new B(); }
}
 
public class Main {
    public static void main(String[] args) {
        C c = new C();
        c.f();     // output: "A: doing f()"
        c.g();     // output: "A: doing g()"
        c.toB();
        c.f();     // output: "B: doing f()"
        c.g();     // output: "B: doing g()"
    }
}

นอกจากนี้ Adapter ยังใช้ transforming data เป็น appropriate forms ก่อนส่งให้ Client
เช่น transforming the format of dates (e.g. YYYYMMDD to MM/DD/YYYY or DD/MM/YYYY)

ตัวอย่าง Adapter อีกอันหนึ่ง


façade 

Facade จะเป็นคนทำโน่น นี่ นั่น ให้


Facade
facade class ซ่อน Packages 1, 2, and 3 จาก Clients

Clients
ใช้ Facade เพื่อเรียก resources จาก Packages


- Facade ซ่อนความยุ่งยากให้กับผู้เรียก
- reduce dependencies จากโลกภายนอกกับ library
- เรายังสามารถใช้ Facade ในการ wrap ดีซายน์ API ห่วยๆ ด้วย designed API ดีๆ อันเดียวได้



สรุป

PatternIntent
Adapter ( wrapper ) Converts one interface to another so that it matches what the client is expecting
DecoratorDynamically adds responsibility to the interface by wrapping the original code
FacadeProvides a simplified interface


ref : wiki and wiki and wiki

ไม่มีความคิดเห็น:

LinkWithin

Related Posts Plugin for WordPress, Blogger...