裝飾者模式
顧名思義,裝飾模式就是給一個對象增加一些新的功能,而且是動态的,通俗一點就是我們現在突然需要給某個已經打包好的類的方法進行增強,不能修改原有的代碼,此時我們就可以使用裝飾者模式,要求裝飾對象和被裝飾對象實作同一個接口,裝飾對象持有被裝飾對象的執行個體
類型:
結構型模式
裝飾者模式的三個對象:
- 被裝飾類(Source)
- 被裝飾類實作的接口(Component)
- 裝飾者類(Decorator)
裝飾者模式關系圖:
裝飾者模式示例:
被裝飾者實作的接口:
/**
* Create by zhaihongwei on 2018/3/16
*/
public interface Component {
void method();
}
被裝飾者類:
/**
* Create by zhaihongwei on 2018/3/16
*/
public class Source implements Component {
@Override
public void method() {
System.out.println("Source 實作的一些功能!");
}
}
裝飾者類:
/**
* Create by zhaihongwei on 2018/3/16
* 裝飾者類
*/
public class Decorator implements Component{
private Component component;
public Decorator(Component component) {
super();
this.component = component;
}
@Override
public void method() {
System.out.println("需要Source的功能!");
component.method();
System.out.println("這裡還有一些别的功能!");
}
}
測試類:
/**
* Create by zhaihongwei on 2018/3/16
*/
public class DecoratorTest {
public static void main(String[] args) {
Component source = new Source();
Component decorator = new Decorator(source);
decorator.method();
}
}
裝飾者模式優缺點:
優點
- 把類中的裝飾功能從類中搬除,可以簡化原來的類
- 可以把類的 核心職責和裝飾功能區分開來,結構清晰 明了并且可以去除相關類的重複的裝飾邏輯。
缺點:
- 如果一個類中有很多方法,使用裝飾者模式實作共同的接口就需要一一實作這個接口中的所有方法,而往往很多方法是我們不需要進行增強,這樣就産生很多多餘的方法要一一調用原類的方法
裝飾者模式最好展現:
java中對裝飾者模式的最好的展現應該是:對于輸入流和輸出流進行裝飾的一些類
個人感想:
因為之前學了擴充卡模式中的類擴充卡模式,總感覺類的擴充卡模式和裝飾者模式很相似,想來想去,可能就是主要關注點不同吧,擴充卡模式主要關注的是接口的轉換,而裝飾者模式主要關注的是通過裝飾者來動态的為被裝飾者注入新的功能。
這是我自己的感覺,還在摸索中,希望了解的大佬可以給留言講解一下。