1. 程式人生 > 程式設計 >java設計模式之委派模式原理分析

java設計模式之委派模式原理分析

委派模式(Delegate)原理:

類B和類A是兩個互相沒有任何關係的類,但是B具有和A一模一樣的方法和屬性;並且呼叫B中的方法/屬性就是呼叫A中同名的方法和屬性。

B好像就是一個受A授權委託的中介,第三方的程式碼不需要知道A的存在,也不需要和A發生直接的聯絡,通過B就可以直接使用A的功能,這樣既能夠使用到A的各種公能,又能夠很好的將A保護起來。

委派模式使得我們可以用聚合來代替繼承,看如下程式碼:

// 類模擬印表機Printer擁有針式印表機RealPrinter的例項
//Printer擁有的方法print()將處理轉交給RealPrinter的print()方法
package Paint;

class RealPrinter { 
  void print() {
    System.out.print("something");
  }
}

class Printer { 
  RealPrinter p = new RealPrinter(); // 委派
  void print() {
    p.print();
  }
}

public class Main {
  public static void main(String[] args) {
    Printer printer = new Printer();
    printer.print();
  }
}

執行結果

看程式碼,比較容易理解,這是一個特別簡單的委派設計模式。如果可以使用介面,那委派可以做到型別更安全並且更加靈活。我們看下面這個例子:

/***在這個例子裡,類C可以委託類A或類B,類C擁有方法使自己可以在類A或類B間選擇。因為類A或類B必須實現介面I規定的方法,所以在這裡委託是型別安全的。**/
package Paint;

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 {
  I i = new A();
  public void f() {
    i.f();
  }
  public void g() {
    i.g();
  }
  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()
  }
}

委託的缺點:程式碼量大,類更多。

----- delegate委派模式和Proxy代理模式 -----

Proxy :譯為代理, 被代理方(B)與代理方(A)的介面完全一致。

主要使用場景:為簡化程式設計(或無法操作B)而把請求交給代理方(A),由代理方與被代理方進行通訊,以完成請求。

Delegete : 譯為委託

主要使用場景:一件事情(或一個請求)物件本身不知道怎樣處理,物件把請求交給其它物件來做。

簡單來講,可以這麼理解,代理是若干個物件實現了一個共同的介面,而委派只是說明一個物件引用了另一個物件,並不牽扯介面。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。