java設計模式筆記之裝飾模式
一、裝飾模式的定義
裝飾模式是一種比較常見的模式,其定義如下:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(動態(tài)地給一個對象添加額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活)
裝飾模式的通用類圖如圖:

Component抽象構件:Component是一個接口或者是抽象類,就是定義我們最核心的對象,也就是最原始的對象
ConcreteComponent具體構件:ConcreteComponent是最核心、最原始、最基本的接口或抽象類的實現(xiàn),你要裝飾的就是它
Decorator裝飾角色:一般一個抽象類,做什么用呢?實現(xiàn)接口或抽象方法,這里面不一定有抽象的方法,在它的屬性里必然有一個private變量指向Component抽象構件
具體裝飾角色:ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類,你要把你最核心的、最原始的、最基本的東西裝飾成其他東西
抽象構件代碼:
public abstract class Component {
//抽象的方法
public abstract void operate();
}
具體構件代碼:
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);
//修飾后運行
component.operate();
}
}
二、裝飾的優(yōu)缺點和使用場景
優(yōu)點:
裝飾類與被裝飾類可以獨立發(fā)展,而不會相互耦合。換句話說,Component類無需知道Decorator類,Decorator類是從外部擴展Component類的功能,而Decorator也不用知道具體的構件
裝飾模式是繼承關系的一個替代方案。我們看裝飾類Decorator,不管裝飾多少層,返回的還是Component,實現(xiàn)的還是is-a的關系
裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能
缺點:
對于裝飾模式記住一點就夠了:多層的裝飾是比較復雜的,就像剝洋蔥,剝到了最后才發(fā)現(xiàn)是最里層的裝飾出現(xiàn)了問題,因此盡量減少裝飾類的數(shù)量,以便降低系統(tǒng)的復雜度。
使用場景:
需要擴展一個累的功能,或者給一個類增加附加功能
需要動態(tài)地給一個對象增加功能,這些功能可以再動態(tài)的撤銷
需要為一批兄弟累進行改裝或假裝功能,當然首選裝飾模式
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
利用Spring Social輕松搞定微信授權登錄的方法示例
這篇文章主要介紹了利用Spring Social輕松搞定微信授權登錄的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Java狀態(tài)設計模式實現(xiàn)對象狀態(tài)轉(zhuǎn)換的優(yōu)雅方式
Java狀態(tài)設計模式通過將對象的行為和狀態(tài)分離,使對象能夠根據(jù)不同的狀態(tài)進行不同的行為操作。它通過將狀態(tài)抽象成一個獨立的類來實現(xiàn)對狀態(tài)的封裝,從而簡化了復雜的條件判斷和狀態(tài)轉(zhuǎn)換2023-04-04
mybatis框架order by作為參數(shù)傳入時失效的解決
這篇文章主要介紹了mybatis框架order by作為參數(shù)傳入時失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

