原文位址: http://www.work100.net/training/monolithic-architecture-design-patterns-decorator-pattern.html 更多教程: 光束雲 - 免費課程
裝飾器模式
請參照如上
章節導航
進行閱讀
1.概述
裝飾器模式(
Decorator Pattern
)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的執行個體來示範裝飾器模式的用法。其中,我們将把一個形狀裝飾上不同的顔色,同時又不改變形狀類。
意圖:
動态地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。
主要解決:
一般的,我們為了擴充一個類經常使用繼承方式實作,由于繼承為類引入靜态特征,并且随着擴充功能的增多,子類會很膨脹。
何時使用:
在不想增加很多子類的情況下擴充類。
如何解決:
将具體功能職責劃分,同時繼承裝飾者模式。
關鍵代碼:
-
類充當抽象角色,不應該具體實作。Component
- 修飾類引用和繼承
類,具體擴充類重寫父類方法。Component
應用執行個體:
- 孫悟空有 72 變,當他變成"廟宇"後,他的根本還是一隻猴子,但是他又有了廟宇的功能。
- 不論一幅畫有沒有畫框都可以挂在牆上,但是通常都是有畫框的,并且實際上是畫框被挂在牆上。在挂在牆上之前,畫可以被蒙上玻璃,裝到框子裡;這時畫、玻璃和畫框形成了一個物體。
優點:
裝飾類和被裝飾類可以獨立發展,不會互相耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動态擴充一個實作類的功能。
缺點:
多層裝飾比較複雜。
使用場景:
- 擴充一個類的功能。
- 動态增加功能,動态撤銷。
注意事項:
可代替繼承。
2.實作
我們将建立一個
Shape
接口和實作了
Shape
接口的實體類。
然後我們建立一個實作了
Shape
接口的抽象裝飾類
ShapeDecorator
,并把
Shape
對象作為它的執行個體變量。
RedShapeDecorator
是實作了
ShapeDecorator
的實體類。
DecoratorPatternDemo
,我們的示範類使用
RedShapeDecorator
來裝飾
Shape
對象。
步驟 1
建立一個接口。
Shape.java
,代碼如下:
public interface Shape {
void draw();
}
步驟 2
建立實作接口的實體類。
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
步驟 3
建立實作了
Shape
接口的抽象裝飾類。
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
步驟 4
建立擴充了
ShapeDecorator
類的實體裝飾類。
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
步驟 5
使用
RedShapeDecorator
Shape
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
步驟 6
執行程式,輸出結果:
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red
上一篇:
組合模式下一篇:
外觀模式如果對課程内容感興趣,可以掃碼關注我們的或
公衆号
,及時關注我們的課程更新
QQ群
