最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java設(shè)計模式系列-裝飾器模式

 更新時間:2019年03月20日 14:31:36   作者:唯一浩哥  
這篇文章主要介紹了Java設(shè)計模式系列-裝飾器模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、概述

裝飾器模式作用是針對目標方法進行增強,提供新的功能或者額外的功能。

不同于適配器模式和橋接模式,裝飾器模式涉及的是單方,和代理模式相同,而且目標必須是抽象的。

而實際上,裝飾器模式和代理模式的實現(xiàn)方式基本一致,只在目標的存在上有些差別,這個后面我們具體講述。

二、初步分析

上面提到了兩點:

  1. 涉及的是單方
  2. 目標是抽象的

我們來想一下,所謂單方主要指的是在整個裝飾器模式中不存在雙方調(diào)用,要解決的也不是雙方調(diào)用的問題,而是解決單方提供對外服務(wù)的問題,這個單方在自行對外提供服務(wù)時,功能不足,或者我們需要額外添加一些新功能,這時就可以使用裝飾器模式,來對這個單方進行增強。

目標抽象的意思是因為我們需要通過實現(xiàn)接口的方式來進行增強,因此目標必須抽象為接口。

三、實例

下面我們用我們生活中的一個例子來說明,我們用房子來作為目標:
房子接口:House

/**
 * 目標接口:房子
 */
public interface House {
 void output();
}

 具體的房子:DonghaoHouse

/**
 * 房子實現(xiàn)類
 */
public class DonghaoHouse implements House {
 @Override
 public void output() {
  System.out.println("這是董浩的房子");
 }
}

具體的房子:DongliangHouse

/**
 * 房子實現(xiàn)類
 */
public class DongliangHouse implements House {
 @Override
 public void output() {
  System.out.println("這是董量的房子");
 }
}

裝飾器:Decorator

public class Decorator implements House {
 private House house;
 public Decorator(House house){
  this.house = house;
 }
 @Override
 public void output() {
  System.out.println("這是針對房子的前段裝飾增強");
  house.output();
  System.out.println("這是針對房子的后段裝飾增強");
 }
}

測試類:

public class Clienter {
 public static void main(String[] args) {
  House donghaoHouse = new DonghaoHouse();
  House decorator = new Decorator(donghaoHouse);
  decorator.output();
 }
}

 執(zhí)行結(jié)果為:

 這是針對房子的前段裝飾增強
這是董浩的房子
這是針對房子的后段裝飾增強

 四、解析

通過上面的例子我們可以看出,除了測試類外,只剩下接口和實現(xiàn)類了,即使是裝飾器類也是目標接口的一個字類,這更能說明單方的說法,模式中所有的類都屬于目標方。至于目標是抽象的更是如此,只有目標是抽象的,才可以使用裝飾器模式來進行增強。

上面我們說過裝飾器模式與代理模式基本相同,只存在少許差別。

我們需要從概念上了解代理和裝飾的區(qū)別:

  1. 代理是全權(quán)代理,目標根本不對外,全部由代理類來完成。
  2. 裝飾是增強,是輔助,目標仍然可以自行對外提供服務(wù),裝飾器只起增強作用。

上面兩點提現(xiàn)到代碼實現(xiàn)中是這樣的:
代理模式

public class Proxy implements House {
 private House house;
 public Decorator(){
  this.house = new DonghaoHouse();
 }
 @Override
 public void output() {
  System.out.println("這是針對目標的前段增強");
  house.output();
  System.out.println("這是針對目標的后段增強");
 }
}

 裝飾模式

public class Decorator implements House {
 private House house;
 public Decorator(House house){
  this.house = house;
 }
 @Override
 public void output() {
  System.out.println("這是針對房子的前段裝飾增強");
  house.output();
  System.out.println("這是針對房子的后段裝飾增強");
 }
}

看出來了嗎,裝飾器中持有的目標實例是從構(gòu)造器傳入的,而代理中持有的目標實例是自己創(chuàng)建的。

那么這里又出現(xiàn)一個區(qū)別,代理模式和裝飾器模式雖然都依賴于目標接口,但是代理針對的目標實現(xiàn)類是固定的,而裝飾器模式可以隨意指定,也就是說目標是可以自有擴展的。

五、使用場景

裝飾器模式就是使用在對已有的目標功能存在不足,需要增強時,前提是目標存在抽象接口。

六、總結(jié)

我們要明白代理模式和裝飾器模式的區(qū)別,區(qū)分二者的使用場景,如下圖:

以上所述是小編給大家介紹的Java設(shè)計模式系列-裝飾器模式詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • mybatis查詢匹配機制圖文詳解

    mybatis查詢匹配機制圖文詳解

    這篇文章主要給大家介紹了關(guān)于mybatis查詢匹配機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java實現(xiàn)短信驗證碼的示例代碼

    Java實現(xiàn)短信驗證碼的示例代碼

    本文主要介紹了Java實現(xiàn)短信驗證碼的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java中@ModelAttribute注解的作用

    java中@ModelAttribute注解的作用

    本文主要介紹了java中@ModelAttribute注解的作用。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 怎么運行用記事本寫的java程序

    怎么運行用記事本寫的java程序

    以下小編就為大家介紹一下,怎么運行用記事本寫的java程序。需要的朋友可以過來參考下
    2013-08-08
  • 解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    這篇文章主要介紹了解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring?Boot?RestController接口輸出到終端的操作代碼

    Spring?Boot?RestController接口輸出到終端的操作代碼

    這篇文章主要介紹了Spring?Boot?RestController接口如何輸出到終端,使用?HttpServletResponse?類,可以在使用curl執(zhí)行?Spring?Boot?REST接口的同時,在控制臺輸出一些信息,給運維人員知道當前命令執(zhí)行的狀態(tài),感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • Spring?Initializr只能創(chuàng)建為Java?17版本以上的問題解決

    Spring?Initializr只能創(chuàng)建為Java?17版本以上的問題解決

    這篇文章主要給大家介紹了關(guān)于Spring?Initializr只能創(chuàng)建為Java?17版本以上問題的解決辦法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • Springboot整合Dozer實現(xiàn)深度復(fù)制的方法

    Springboot整合Dozer實現(xiàn)深度復(fù)制的方法

    Dozer是一種Java?Bean到Java?Bean的映射器,遞歸地將數(shù)據(jù)從一個對象復(fù)制到另一個對象,它是一個強大的,通用的,靈活的,可重用的和可配置的開源映射框架,本文給大家介紹Springboot整合Dozer的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Java實體類實現(xiàn)鏈式操作實例解析

    Java實體類實現(xiàn)鏈式操作實例解析

    這篇文章主要介紹了Java實體類實現(xiàn)鏈式操作實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • java 中數(shù)組初始化實例詳解

    java 中數(shù)組初始化實例詳解

    這篇文章主要介紹了 本文主要講數(shù)組的初始化方法、可變參數(shù)列表以及可變參數(shù)列表對函數(shù)重載的影響的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論

通州区| 泊头市| 汉源县| 平顶山市| 吉木萨尔县| 红河县| 镇康县| 西盟| 青冈县| 太康县| 灵丘县| 渭源县| 社旗县| 尚志市| 安远县| 阳春市| 阿巴嘎旗| 怀宁县| 武平县| 武安市| 黄骅市| 达尔| 卢湾区| 大城县| 三原县| 荣成市| 新宁县| 京山县| 东莞市| 凉城县| 陆良县| 彰化县| 龙泉市| 潜江市| 蓬安县| 平乡县| 沈丘县| 石柱| 庆元县| 永吉县| 和龙市|