溫馨提示×

溫馨提示×

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

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

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

發(fā)布時(shí)間:2020-09-05 13:12:00 來源:腳本之家 閱讀:155 作者:孟凡勇 欄目:編程語言

一、裝飾模式的定義

裝飾模式是一種比較常見的模式,其定義如下: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è)對象添加額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更為靈活)

裝飾模式的通用類圖如圖:

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

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

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

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

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

抽象構(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();
  }
}

具體裝飾類:

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();
  }
}

場景類:

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)和使用場景

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

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

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

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

缺點(diǎn):

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

使用場景:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI