2010-06-07 8 views

Odpowiedz

15

Jeśli masz na myśli wzorzec delegowania, wikipedia has a great example, written in java.

wierzę już przykładem stronie powyżej jest najlepszy:

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 
    void toA() { i = new A(); } 
    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() 
    } 
} 
+0

dziękuję! Korzyścią delegacji z dziedziczenia jest zmiana środowiska wykonawczego, ale wszystkie przykłady, które mogłem wymyślić, przypominają kompozycję bardziej niż delegację. Ten przykład wyraźnie pokazuje, co autorzy artykułów, które przeczytałem, mają na myśli. – Chaitanya

39

To delegacja - dokładnie tak samo jak w realnym świecie:

public interface Worker() { 
    public Result work(); 
} 

public class Secretary() implements Worker { 

    public Result work() { 
    Result myResult = new Result(); 
    return myResult; 
    }  
} 

public class Boss() implements Worker { 

    private Secretary secretary; 

    public Result work() { 
    return secretary.work(); 
    } 
} 

(Dodane Pracownik interfejsu, aby zbliżyć się do wzorzec Delegatora)

2

Ten sam przykład, co aioobe, ale zmieniono nazwy klas na bardziej intuicyjne. Porównywanie analogii do rzeczywistych przykładów.

public static void main(String[] args) { 
    Boss boss = new Boss(); 
    boss.toDeveloper(); 
    boss.f(); 
    boss.g(); 

    boss.toSrDeveloper(); 
    boss.f(); 
    boss.g(); 
} 

interface I { 
    void f(); 
    void g(); 
} 

class Developer implements I { 
    public void f() { 
     System.out.println("Developer: f() is too hard for me."); 
    } 

    public void g() { 
     System.out.println("Developer: g() is not in my domain."); 
    } 
} 

class SrDeveloper implements I { 
    public void f() { 
     System.out.println("Sr. Developer: Okay, I'll see f()"); 
    } 

    public void g() { 
     System.out.println("Sr. Developer: I'll do g() too."); 
    } 
} 

class Boss implements I { 
    // delegation 
    I i; 

    public void f() { 
     i.f(); 
    } 

    public void g() { 
     i.g(); 
    } 

    void toDeveloper() { 
     i = new Developer(); 
    } 

    void toSrDeveloper() { 
     i = new SrDeveloper(); 
    } 
} 
Powiązane problemy