裝飾器模式:動態(tài)的給對象添加新的功能。
主要有以下幾種角色:
ConcreteCompnent(具體構(gòu)件):作為需要被裝飾的類,在具體構(gòu)件中只需要實現(xiàn)最基礎(chǔ)的業(yè)務(wù)邏輯即可;
Decorator(抽象裝飾器):抽象裝飾器維護(hù)了一個指向抽象構(gòu)件對象的引用(子類通過構(gòu)造器等方法明確使用何種具體構(gòu)件),即通過組合方式將裝飾者和被裝飾者建立起一個相比繼承關(guān)系更為寬松的聯(lián)系。同時作為抽象構(gòu)件的子類,抽象裝飾器還給具體構(gòu)件增加了額外的職責(zé),其額外的職責(zé)在抽象裝飾器的子類中得到實現(xiàn);
ConcreteDecorator(具體裝飾器):作為抽象裝飾器的子類,具體裝飾器實現(xiàn)了需要給具體構(gòu)件添加的額外職責(zé);
Component(抽象構(gòu)件):需要被裝飾類的基類,同時也是裝飾者的基類,在這個基類中聲明了需要實現(xiàn)的業(yè)務(wù)方法
1、優(yōu)點
(1)裝飾類和被裝飾類可以獨立發(fā)展,而不會相互耦合。換句話說,Component類無需知道Decorator類,Decorator類是從外部來擴展Component類的功能,而Decorator也不用知道具體的構(gòu)件。
(2)裝飾器模式是繼承關(guān)系的一個替代方案。我們看裝飾類Decorator,不管裝飾多少層,返回的對象還是Component(因為Decorator本身就是繼承自Component的),實現(xiàn)的還是is-a的關(guān)系。
2、缺點
(1)裝飾器模式雖然減少了類的爆炸,但是在使用的時候,你就可能需要更多的對象來表示繼承關(guān)系中的一個對象
(2)裝飾器模式雖然從數(shù)量級上減少了類的數(shù)量,但是為了要裝飾,仍舊會增加很多的小類這些具體的裝飾類的邏輯將不會非常的清晰,不夠直觀,容易令人迷惑。
示例
Component(抽象構(gòu)件):
public interface Product {
void fuction();
}
ConcreteCompnent(具體構(gòu)件):
public class Phone implements Product{
@Override
public void fuction() {
System.out.println("手機能拍照");
}
}
Decorator(抽象裝飾器):
public abstract class PhoneDecorator implements Product {
private Product product;
public PhoneDecorator(Product product) {
this.product = product;
}
@Override
public void fuction() {
this.product.fuction();
}
}
ConcreteDecorator(具體裝飾器):
public class PhoneDecoratorInfo extends PhoneDecorator{
public PhoneDecoratorInfo(Product product) {
super(product);
}
@Override
public void fuction() {
super.fuction();
System.out.println("添加短信功能");
}
}
public class PhoneDecoratorInfo1 extends PhoneDecorator{
public PhoneDecoratorInfo1(Product product) {
super(product);
}
@Override
public void fuction() {
super.fuction();
System.out.println("添加一個打電話功能");
}
}
測試:文章來源:http://www.zghlxwxcb.cn/news/detail-408252.html
public class Test {
public static void main(String[] args) {
Product product=new Phone();
PhoneDecoratorInfo phoneDecoratorInfo = new PhoneDecoratorInfo(product);
PhoneDecoratorInfo phoneDecoratorInfo1=new PhoneDecoratorInfo(new PhoneDecoratorInfo1(new PhoneDecoratorInfo1(phoneDecoratorInfo)));
phoneDecoratorInfo1.fuction();
}
}
結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-408252.html
到了這里,關(guān)于裝飾器模式(結(jié)構(gòu)性)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!