欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

一、概述

灞橋網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,灞橋網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為灞橋上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的灞橋做網(wǎng)站的公司定做!

裝飾器模式作用是針對(duì)目標(biāo)方法進(jìn)行增強(qiáng),提供新的功能或者額外的功能。

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

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

二、初步分析

上面提到了兩點(diǎn):

  1. 涉及的是單方
  2. 目標(biāo)是抽象的

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

目標(biāo)抽象的意思是因?yàn)槲覀冃枰ㄟ^(guò)實(shí)現(xiàn)接口的方式來(lái)進(jìn)行增強(qiáng),因此目標(biāo)必須抽象為接口。

三、實(shí)例

下面我們用我們生活中的一個(gè)例子來(lái)說(shuō)明,我們用房子來(lái)作為目標(biāo):
房子接口:House

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

 具體的房子:DonghaoHouse

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

具體的房子:DongliangHouse

/**
 * 房子實(shí)現(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("這是針對(duì)房子的前段裝飾增強(qiáng)");
  house.output();
  System.out.println("這是針對(duì)房子的后段裝飾增強(qiáng)");
 }
}

測(cè)試類:

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

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

 這是針對(duì)房子的前段裝飾增強(qiáng)
這是董浩的房子
這是針對(duì)房子的后段裝飾增強(qiáng)

 四、解析

通過(guò)上面的例子我們可以看出,除了測(cè)試類外,只剩下接口和實(shí)現(xiàn)類了,即使是裝飾器類也是目標(biāo)接口的一個(gè)字類,這更能說(shuō)明單方的說(shuō)法,模式中所有的類都屬于目標(biāo)方。至于目標(biāo)是抽象的更是如此,只有目標(biāo)是抽象的,才可以使用裝飾器模式來(lái)進(jìn)行增強(qiáng)。

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

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

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

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

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

 裝飾模式

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

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

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

五、使用場(chǎng)景

裝飾器模式就是使用在對(duì)已有的目標(biāo)功能存在不足,需要增強(qiáng)時(shí),前提是目標(biāo)存在抽象接口。

六、總結(jié)

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

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

以上所述是小編給大家介紹的Java設(shè)計(jì)模式系列-裝飾器模式詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!

當(dāng)前題目:淺談Java設(shè)計(jì)模式系列-裝飾器模式
標(biāo)題網(wǎng)址:http://chinadenli.net/article28/pigpjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈微信公眾號(hào)用戶體驗(yàn)云服務(wù)器網(wǎng)站建設(shè)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)