溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中代理模式與裝飾模式的區(qū)別有哪些

發(fā)布時間:2020-12-05 16:45:09 來源:億速云 閱讀:244 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家?guī)碛嘘PJava中代理模式與裝飾模式的區(qū)別有哪些,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

定義:

代理模式,為其他對象提供一種代理以控制對這個對象的訪問。

裝飾模式,動態(tài)地給一個對象添加一些額外的職責。

代理模式,很好理解,就是把一個對象再次封裝,以后就對封裝的對象訪問就可以了。

因為代理對象已經取代了被代理對象。

裝飾模式,給一個對象增加功能,形象一點就是做為一個服務生站在一邊提供服務。

所以根本的區(qū)別是,裝飾模式對象還在場,不是取代原對象,而是在一邊提供服務。

本文所闡述觀點均為個人理解,只對本人負責。

下面給出例子:

package test.design.proxydecorator;
/**
 * 接口定義行為:吃飯
 * @author lushuaiyin
 *
 */
public interface Eatable {
  void eatFood();
}
package test.design.proxydecorator;
/**
 * 實現(xiàn)類
 * @author lushuaiyin
 *
 */
public class Man implements Eatable{
  @Override
  public void eatFood() {
    System.out.println("I am eating food! Happy!");
  }
}

以上是普通的接口與實現(xiàn),下面是模式實例

代理模式

package test.design.proxydecorator;
/**
 * 代理模式
 * 代理對象把被代理對象封裝,像一個包裝盒把被代理對象包裹起來。
 * 它不改變被代理對象的原有邏輯,只是增加來了一些自己的服務,像一個代理一樣。
 * 代理從使用上給調用者的感覺就是你已經取代了原來的對象。
 * 就像皇太后取代小皇帝實行垂簾聽政。
 * @author Administrator
 *
 */
public class ProxyMan implements Eatable{
  private Eatable eatable;
  public ProxyMan(){
    System.out.println("proxy: I am proxy object. I will help you create a object of Man that wnt to be proxyed");
    this.eatable=new Man();
    //注意代理對象把被代理對象封裝,在內部有實際的被代理對象,這個調用者是不知道的。
  }
  @Override
  public void eatFood() {
    //代理對象把被代理對象的功能封裝,蛋不改變其內部邏輯,只是增加一些服務。
    System.out.println("proxy: I know you are hungry,so I cook for you some food.");
    this.eatable.eatFood();
    System.out.println("proxy: Now you eat up food. Let me help you clean the dishes.");
  }
}

裝飾模式

package test.design.proxydecorator;
/**
 * 裝飾的抽象.
 * 也可以不用抽象類,簡單的父類也可以,只要實現(xiàn)裝飾功能.
 * 抽象只是為了增加一層封裝,規(guī)定裝飾者必有的裝飾功能而已。
 * @author lushuaiyin
 *
 */
public abstract class DecoratorMan {
  protected Eatable eatable;
  //使用構造函數(shù)或者set方法(或其他方法)把接口對象傳入。
  //注意,必須保證這個對象的傳入,最好還是用構造函數(shù)。
  public DecoratorMan(Eatable eatable){
    this.eatable=eatable;
  }
  public void eatFood(){
    this.eatable.eatFood();
  };
}
package test.design.proxydecorator;
/**
 * 裝飾模式
 * 裝飾對象時獨立于原來的對象的。它和被裝飾的對象有關系,但是是獨立的對象。
 * 裝飾對象更像一個酒店服務生,為別人提供服務,所以他還是他自己,他有自己的實際存在。
 * @author lushuaiyin
 *
 */
public class Decorator extends DecoratorMan{
  public Decorator(Eatable eatable) {
    super(eatable);
  }
  //重寫父類方法
  public void eatFood(){
    decoratorServiceCookFood();//裝飾的具體行為
    super.eatable.eatFood();
    decoratorServiceCleanDishes();//裝飾的具體行為
  };
  public void decoratorServiceCookFood(){
    System.out.println("Decorator: I know you are hungry,so I cook for you some food.");
  }
  public void decoratorServiceCleanDishes(){
    System.out.println("Decorator: Now you eat up food. Let me help you clean the dishes.");
  }
}

最關鍵的是調用,這也是這兩種模式的主要區(qū)別所在!

package test.design.proxydecorator;
public class TestMain {
  /**
   * @param args
   */
  public static void main(String[] args) {
    //代理模式
    System.out.println("代理模式:");
    Man m1=new Man();//通常情況下
    m1.eatFood();
    System.out.println("---------------------------");
    //代理模式者直接取代某對象,你連你想要見的人的面都見不到。
    //它說你要見的人已經把所有事委托于我,他會的我會;他不會的,我也會。我就是他的替代增強版。
    Eatable e1=new ProxyMan();
    e1.eatFood();
    System.out.println("------------分割---------------");
    System.out.println("裝飾模式:");
    Man m2=new Man();//通常情況下
    m2.eatFood();
    System.out.println("---------------------------");
    //裝飾模式者站在一邊提供各種服務.
    //裝飾者和被裝飾者都在場,裝飾者提供服務,賺取小費。
    Decorator d1=new Decorator(m2);
    d1.eatFood();
  }
}

打印:

代理模式:
I am eating food! Happy!
---------------------------
proxy: I am proxy object. I will help you create a object of Man that wnt to be proxyed
proxy: I know you are hungry,so I cook for you some food.
I am eating food! Happy!
proxy: Now you eat up food. Let me help you clean the dishes.
------------分割---------------
裝飾模式:
I am eating food! Happy!
---------------------------
Decorator: I know you are hungry,so I cook for you some food.
I am eating food! Happy!
Decorator: Now you eat up food. Let me help you clean the dishes.

上述就是小編為大家分享的Java中代理模式與裝飾模式的區(qū)別有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI