亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

淺談Java設計模式系列-裝飾器模式

發布時間:2020-10-04 09:56:35 來源:腳本之家 閱讀:193 作者:唯一浩哥 欄目:編程語言

一、概述

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

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

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

二、初步分析

上面提到了兩點:

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

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

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

三、實例

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

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

 具體的房子:DonghaoHouse

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

具體的房子:DongliangHouse

/**
 * 房子實現類
 */
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();
 }
}

 執行結果為:

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

 四、解析

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

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

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

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

上面兩點提現到代碼實現中是這樣的:
代理模式

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("這是針對房子的后段裝飾增強");
 }
}

看出來了嗎,裝飾器中持有的目標實例是從構造器傳入的,而代理中持有的目標實例是自己創建的。

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

五、使用場景

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

六、總結

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

淺談Java設計模式系列-裝飾器模式

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

向AI問一下細節

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

AI

南京市| 嵩明县| 尚志市| 沅江市| 德阳市| 河源市| 太仓市| 新绛县| 静宁县| 黎城县| 怀集县| 平舆县| 阜宁县| 铜川市| 洛阳市| 尉犁县| 鹤山市| 育儿| 大余县| 开江县| 牡丹江市| 白玉县| 和林格尔县| 同德县| 南丰县| 翁源县| 平利县| 石楼县| 皮山县| 屏边| 府谷县| 汉寿县| 柘城县| 青州市| 休宁县| 新乐市| 银川市| 永丰县| 平塘县| 平阳县| 泸水县|