場(chǎng)景介紹
王大哥的女兒剛大學(xué)畢業(yè),是一個(gè)膚白貌美的程序猿,入職了一家圖像處理相關(guān)的互聯(lián)網(wǎng)公司螺捐;最近,項(xiàng)目經(jīng)理要求她對(duì)一個(gè)圖像處理軟件進(jìn)行二次開發(fā)矮燎,需要在原有的基礎(chǔ)上支持添加各種貼圖定血,各種背景圖;那么她該如何動(dòng)手呢诞外?
裝飾者模式
我們了解到需求后澜沟,知道她需要保持原有的代碼和設(shè)計(jì),并對(duì)原有功能進(jìn)行擴(kuò)展使其具有新的功能峡谊,于是我們想到了裝飾者模式
茫虽;裝飾者模式的特點(diǎn)便是對(duì)原對(duì)象進(jìn)行功能的擴(kuò)展刊苍,同時(shí)不改變其結(jié)構(gòu),是對(duì)原有對(duì)象的一次包裝
濒析。通常在裝飾者模式中有如下幾種角色:
- Componment 抽象組件
- ConcreteComponment 組件實(shí)現(xiàn)類正什,實(shí)現(xiàn)了抽象組件的功能
- Decorator 裝飾器,同時(shí)持有
Componment
成員變量 - ConcreteDecorator 裝飾器功能實(shí)現(xiàn)者
我們可以參考如下類圖關(guān)系:
代碼示例
首先我們定義一個(gè)Shape
圖形接口
public interface Shape {
/**
* 繪畫方法
*/
void draw();
}
其次号杏,我們?cè)诙xShape
的實(shí)現(xiàn)類Circle
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle");
}
}
關(guān)鍵點(diǎn)來了埠忘,我們來裝飾我們的Shape
圖形
public abstract class ShapeDecorator implements Shape {
protected Shape shape;
public ShapeDecorator(Shape shape) {
this.shape = shape;
}
/**
* 裝飾顏色
*/
protected abstract void color();
@Override
public void draw() {
shape.draw();
}
}
最后,裝飾者的實(shí)現(xiàn)類ColorDecorator
public class ColorDecorator extends ShapeDecorator {
public ColorDecorator(Shape shape) {
super(shape);
}
@Override
public void draw() {
this.color();
super.draw();
}
@Override
protected void color() {
System.out.print("Colorful ");
}
}
讓我們編寫一個(gè)Demo測(cè)試一下裝飾者的效果:
public class DecoratorDemo {
public static void main(String[] args) {
Shape circle = new Circle();
circle.draw();
ColorDecorator colorfulCircle=new ColorDecorator(circle);
colorfulCircle.draw();
}
}
演示效果如下:
Circle
Colorful Circle
總結(jié)
以上我們通過繪制圖形馒索,以及給圖形裝飾顏色對(duì)裝飾者模式進(jìn)行了簡(jiǎn)短的說明莹妒;實(shí)際上我們?cè)贘ava IO 中也是隨處可見裝飾者模式的影子;其中InputStream
相當(dāng)于組件接口绰上,FileInputStream
是組件的具體的實(shí)現(xiàn)類旨怠,而FilterInputStream
則是裝飾器,BufferedInputStream
是裝飾者的具體實(shí)現(xiàn)蜈块,它在原有的基礎(chǔ)上擴(kuò)展出了緩存的功能鉴腻。