欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計(jì)模式之代理模式與裝飾模式實(shí)例詳解

 更新時(shí)間:2017年09月22日 10:00:18   作者:索隆  
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式與裝飾模式,結(jié)合具體實(shí)例形式分析了代理模式與裝飾模式的概念、功能、java實(shí)現(xiàn)方法與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java設(shè)計(jì)模式之代理模式與裝飾模式。分享給大家供大家參考,具體如下:

之所以把這兩種模式放在一起說,是因?yàn)槲野l(fā)現(xiàn)這了兩種模式幾乎一模一樣!

從網(wǎng)上也搜了一些資料,發(fā)現(xiàn)兩者還是有一些區(qū)別的。我們?cè)趯W(xué)習(xí)的同時(shí)也把這種困惑搞清楚。

定義:

代理模式,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。

裝飾模式,動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。

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

因?yàn)榇韺?duì)象已經(jīng)取代了被代理對(duì)象。

裝飾模式,給一個(gè)對(duì)象增加功能,形象一點(diǎn)就是做為一個(gè)服務(wù)生站在一邊提供服務(wù)。

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

本文所闡述觀點(diǎn)均為個(gè)人理解,只對(duì)本人負(fù)責(zé)。

下面給出例子:

package test.design.proxydecorator;
/**
 * 接口定義行為:吃飯
 * @author lushuaiyin
 *
 */
public interface Eatable {
  void eatFood();
}

package test.design.proxydecorator;
/**
 * 實(shí)現(xiàn)類
 * @author lushuaiyin
 *
 */
public class Man implements Eatable{
  @Override
  public void eatFood() {
    System.out.println("I am eating food! Happy!");
  }
}

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

代理模式

package test.design.proxydecorator;
/**
 * 代理模式
 * 代理對(duì)象把被代理對(duì)象封裝,像一個(gè)包裝盒把被代理對(duì)象包裹起來。
 * 它不改變被代理對(duì)象的原有邏輯,只是增加來了一些自己的服務(wù),像一個(gè)代理一樣。
 * 代理從使用上給調(diào)用者的感覺就是你已經(jīng)取代了原來的對(duì)象。
 * 就像皇太后取代小皇帝實(shí)行垂簾聽政。
 * @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();
    //注意代理對(duì)象把被代理對(duì)象封裝,在內(nèi)部有實(shí)際的被代理對(duì)象,這個(gè)調(diào)用者是不知道的。
  }
  @Override
  public void eatFood() {
    //代理對(duì)象把被代理對(duì)象的功能封裝,蛋不改變其內(nèi)部邏輯,只是增加一些服務(wù)。
    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;
/**
 * 裝飾的抽象.
 * 也可以不用抽象類,簡(jiǎn)單的父類也可以,只要實(shí)現(xiàn)裝飾功能.
 * 抽象只是為了增加一層封裝,規(guī)定裝飾者必有的裝飾功能而已。
 * @author lushuaiyin
 *
 */
public abstract class DecoratorMan {
  protected Eatable eatable;
  //使用構(gòu)造函數(shù)或者set方法(或其他方法)把接口對(duì)象傳入。
  //注意,必須保證這個(gè)對(duì)象的傳入,最好還是用構(gòu)造函數(shù)。
  public DecoratorMan(Eatable eatable){
    this.eatable=eatable;
  }
  public void eatFood(){
    this.eatable.eatFood();
  };
}

package test.design.proxydecorator;
/**
 * 裝飾模式
 * 裝飾對(duì)象時(shí)獨(dú)立于原來的對(duì)象的。它和被裝飾的對(duì)象有關(guān)系,但是是獨(dú)立的對(duì)象。
 * 裝飾對(duì)象更像一個(gè)酒店服務(wù)生,為別人提供服務(wù),所以他還是他自己,他有自己的實(shí)際存在。
 * @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.");
  }
}

最關(guān)鍵的是調(diào)用,這也是這兩種模式的主要區(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("---------------------------");
    //代理模式者直接取代某對(duì)象,你連你想要見的人的面都見不到。
    //它說你要見的人已經(jīng)把所有事委托于我,他會(huì)的我會(huì);他不會(huì)的,我也會(huì)。我就是他的替代增強(qiáng)版。
    Eatable e1=new ProxyMan();
    e1.eatFood();
    System.out.println("------------分割---------------");
    System.out.println("裝飾模式:");
    Man m2=new Man();//通常情況下
    m2.eatFood();
    System.out.println("---------------------------");
    //裝飾模式者站在一邊提供各種服務(wù).
    //裝飾者和被裝飾者都在場(chǎng),裝飾者提供服務(wù),賺取小費(fèi)。
    Decorator d1=new Decorator(m2);
    d1.eatFood();
  }
}

打?。?/p>

代理模式:
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相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解spring cloud hystrix請(qǐng)求緩存(request cache)

    詳解spring cloud hystrix請(qǐng)求緩存(request cache)

    這篇文章主要介紹了詳解spring cloud hystrix請(qǐng)求緩存(request cache),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Springboot使用sharedingjdbc實(shí)現(xiàn)分庫(kù)分表

    Springboot使用sharedingjdbc實(shí)現(xiàn)分庫(kù)分表

    這篇文章主要介紹了Springboot使用sharedingjdbc實(shí)現(xiàn)分庫(kù)分表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 解決IDEA啟動(dòng)springboot項(xiàng)目報(bào)錯(cuò)java.lang.ClassNotFoundException:?javax.servlet.ServletContext

    解決IDEA啟動(dòng)springboot項(xiàng)目報(bào)錯(cuò)java.lang.ClassNotFoundException:?jav

    這篇文章主要介紹了解決IDEA啟動(dòng)springboot項(xiàng)目報(bào)錯(cuò)java.lang.ClassNotFoundException:?javax.servlet.ServletContext問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 解析SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程

    解析SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程

    這篇文章主要介紹了SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程,本文給大家分享幾種Gzip壓縮方式,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring?Boot?優(yōu)雅停機(jī)原理詳解

    Spring?Boot?優(yōu)雅停機(jī)原理詳解

    這篇文章主要為大家介紹了Spring?Boot?優(yōu)雅停機(jī)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • springboot項(xiàng)目組引入JMeter的實(shí)現(xiàn)步驟

    springboot項(xiàng)目組引入JMeter的實(shí)現(xiàn)步驟

    本文主要介紹了springboot項(xiàng)目組引入JMeter的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J

    詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J

    本篇文章主要介紹了詳解Spring Boot實(shí)現(xiàn)日志記錄 SLF4J,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 使用java基礎(chǔ)類實(shí)現(xiàn)zip壓縮和zip解壓工具類分享

    使用java基礎(chǔ)類實(shí)現(xiàn)zip壓縮和zip解壓工具類分享

    使用java基礎(chǔ)類寫的一個(gè)簡(jiǎn)單的zip壓縮解壓工具類,實(shí)現(xiàn)了指定目錄壓縮到和該目錄同名的zip文件和將zip文件解壓到指定的目錄的功能
    2014-03-03
  • RocketMQ?producer發(fā)送者淺析

    RocketMQ?producer發(fā)送者淺析

    RocketMQ生產(chǎn)者是一種高性能、可靠的消息發(fā)送者,能夠?qū)⑾⒖焖?、可靠地發(fā)送到RocketMQ消息隊(duì)列中。它具有多種消息發(fā)送模式和消息發(fā)送方式,可以根據(jù)不同的業(yè)務(wù)需求進(jìn)行靈活配置
    2023-04-04
  • Java遍歷Map鍵、值和獲取Map大小的方法示例

    Java遍歷Map鍵、值和獲取Map大小的方法示例

    本篇文章主要介紹了Java遍歷Map鍵、值和獲取Map大小的方法示例,詳細(xì)的介紹了Java遍歷Map的兩種實(shí)現(xiàn)方法和大小,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01

最新評(píng)論