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

java設(shè)計(jì)模式筆記之裝飾模式

 更新時(shí)間:2019年04月01日 08:34:07   作者:孟凡勇  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式筆記之裝飾模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、裝飾模式的定義

裝飾模式是一種比較常見(jiàn)的模式,其定義如下:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(動(dòng)態(tài)地給一個(gè)對(duì)象添加額外的職責(zé)。就增加功能來(lái)說(shuō),裝飾模式相比生成子類(lèi)更為靈活)

裝飾模式的通用類(lèi)圖如圖:

Component抽象構(gòu)件:Component是一個(gè)接口或者是抽象類(lèi),就是定義我們最核心的對(duì)象,也就是最原始的對(duì)象

ConcreteComponent具體構(gòu)件:ConcreteComponent是最核心、最原始、最基本的接口或抽象類(lèi)的實(shí)現(xiàn),你要裝飾的就是它

Decorator裝飾角色:一般一個(gè)抽象類(lèi),做什么用呢?實(shí)現(xiàn)接口或抽象方法,這里面不一定有抽象的方法,在它的屬性里必然有一個(gè)private變量指向Component抽象構(gòu)件

具體裝飾角色:ConcreteDecoratorA和ConcreteDecoratorB是兩個(gè)具體的裝飾類(lèi),你要把你最核心的、最原始的、最基本的東西裝飾成其他東西

抽象構(gòu)件代碼:

public abstract class Component {
  //抽象的方法
  public abstract void operate();
}

具體構(gòu)件代碼:

public class ConcreteComponent extends Component {
  @Override
  public void operate() {
    System.out.println("do somthing");
  }
}

抽象裝飾者:

public abstract class Decorator extends Component {
  private Component component = null;
 
  public Decorator(Component component) {
    this.component = component;
  }
 
  @Override
  public void operate() {
    this.component.operate();
  }
}

具體裝飾類(lèi):

public class ConcreteDecorator1 extends Decorator {
  public ConcreteDecorator1(Component component) {
    super(component);
  }
 
  private void method1() {
    System.out.println("method1 修飾");
  }
 
  @Override
  public void operate() {
    this.method1();
    super.operate();
  }
}
public class ConcreteDecorator2 extends Decorator {
  public ConcreteDecorator2(Component component) {
    super(component);
  }
 
  private void method2() {
    System.out.println("method2 修飾");
  }
 
  @Override
  public void operate() {
    this.method2();
    super.operate();
  }
}

場(chǎng)景類(lèi):

public class Client {
  public static void main(String args[]) {
    Component component = new ConcreteComponent();
    //第一次修飾
    component = new ConcreteDecorator1(component);
    //第二次修飾
    component = new ConcreteDecorator2(component);
    //修飾后運(yùn)行
    component.operate();
  }
}

二、裝飾的優(yōu)缺點(diǎn)和使用場(chǎng)景

優(yōu)點(diǎn):

裝飾類(lèi)與被裝飾類(lèi)可以獨(dú)立發(fā)展,而不會(huì)相互耦合。換句話(huà)說(shuō),Component類(lèi)無(wú)需知道Decorator類(lèi),Decorator類(lèi)是從外部擴(kuò)展Component類(lèi)的功能,而Decorator也不用知道具體的構(gòu)件

裝飾模式是繼承關(guān)系的一個(gè)替代方案。我們看裝飾類(lèi)Decorator,不管裝飾多少層,返回的還是Component,實(shí)現(xiàn)的還是is-a的關(guān)系

裝飾模式可以動(dòng)態(tài)地?cái)U(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能

缺點(diǎn):

對(duì)于裝飾模式記住一點(diǎn)就夠了:多層的裝飾是比較復(fù)雜的,就像剝洋蔥,剝到了最后才發(fā)現(xiàn)是最里層的裝飾出現(xiàn)了問(wèn)題,因此盡量減少裝飾類(lèi)的數(shù)量,以便降低系統(tǒng)的復(fù)雜度。

使用場(chǎng)景:

需要擴(kuò)展一個(gè)累的功能,或者給一個(gè)類(lèi)增加附加功能
需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的撤銷(xiāo)
需要為一批兄弟累進(jìn)行改裝或假裝功能,當(dāng)然首選裝飾模式

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Scala小程序詳解及實(shí)例代碼

    Scala小程序詳解及實(shí)例代碼

    這篇文章主要介紹了Scala 第一個(gè)Scala小程序詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 利用Spring Social輕松搞定微信授權(quán)登錄的方法示例

    利用Spring Social輕松搞定微信授權(quán)登錄的方法示例

    這篇文章主要介紹了利用Spring Social輕松搞定微信授權(quán)登錄的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Java狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)對(duì)象狀態(tài)轉(zhuǎn)換的優(yōu)雅方式

    Java狀態(tài)設(shè)計(jì)模式實(shí)現(xiàn)對(duì)象狀態(tài)轉(zhuǎn)換的優(yōu)雅方式

    Java狀態(tài)設(shè)計(jì)模式通過(guò)將對(duì)象的行為和狀態(tài)分離,使對(duì)象能夠根據(jù)不同的狀態(tài)進(jìn)行不同的行為操作。它通過(guò)將狀態(tài)抽象成一個(gè)獨(dú)立的類(lèi)來(lái)實(shí)現(xiàn)對(duì)狀態(tài)的封裝,從而簡(jiǎn)化了復(fù)雜的條件判斷和狀態(tài)轉(zhuǎn)換
    2023-04-04
  • SpringBoot整合gateway全過(guò)程

    SpringBoot整合gateway全過(guò)程

    這篇文章主要介紹了SpringBoot整合gateway全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Shell打Jar包時(shí)常用小技巧

    Spring Shell打Jar包時(shí)常用小技巧

    這篇文章主要介紹了Spring Shell打Jar包時(shí)常用小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Micronaut框架的簡(jiǎn)單使用介紹

    Micronaut框架的簡(jiǎn)單使用介紹

    這篇文章主要介紹了Micronaut框架的簡(jiǎn)單使用介紹,幫助大家更好的理解和學(xué)習(xí)使用Micronaut,感興趣的朋友可以了解下
    2021-04-04
  • java中注解的原理解析

    java中注解的原理解析

    這篇文章主要介紹了java中注解的原理解析,java 注解又稱(chēng) Java 標(biāo)注,是 JDK5.0 引入的一種注釋機(jī)制,可以理解為為某個(gè)東西,打個(gè)標(biāo)記的記號(hào),等要使用這個(gè)注解時(shí),可以通過(guò)反射獲取標(biāo)注里面的內(nèi)容,需要的朋友可以參考下
    2023-10-10
  • mybatis框架order by作為參數(shù)傳入時(shí)失效的解決

    mybatis框架order by作為參數(shù)傳入時(shí)失效的解決

    這篇文章主要介紹了mybatis框架order by作為參數(shù)傳入時(shí)失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis延遲加載實(shí)現(xiàn)步驟詳解

    MyBatis延遲加載實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis延遲加載實(shí)現(xiàn)步驟詳解,? MyBatis中的延遲加載,也成為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置的延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的查詢(xún),延遲加載可以有效的減少數(shù)據(jù)庫(kù)的壓力,需要的朋友可以參考下
    2023-10-10
  • Java編程實(shí)現(xiàn)打地鼠文字游戲?qū)嵗a

    Java編程實(shí)現(xiàn)打地鼠文字游戲?qū)嵗a

    這篇文章主要介紹了Java編程實(shí)現(xiàn)打地鼠文字游戲?qū)嵗a,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11

最新評(píng)論

甘德县| 湖北省| 新竹县| 苍南县| 北票市| 米脂县| 南宫市| 金阳县| 浦城县| 报价| 十堰市| 静海县| 桂东县| 濉溪县| 新源县| 明溪县| 黑水县| 都安| 阿克| 五河县| 汉寿县| 房产| 石嘴山市| 江西省| 大冶市| 嘉禾县| 蒲城县| 呼和浩特市| 友谊县| 南汇区| 本溪| 通海县| 彭州市| 临朐县| 饶河县| 和龙市| 郯城县| 谢通门县| 宽甸| 惠州市| 岳普湖县|