一、模式定義
在不改變原有對象的前提下(不改變ConcreteComponent情況下),給原有對象擴展功能(利用ConcreteDecorator擴展功能,在ConcreteDecorator中注入ConcreteComponent)。如下所示:

二、應用場景
擴展一個類的功能,或者給一個類添加一些附加職責
三、優點:
①、靈活改變組合;
②、符合開閉原則;
四、裝飾者模式的實現方式
4.1、方式1
package decorator;
public class DecoratorDesignPattern {
public static void main(String[] args) {
Decorator decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
decoratorA.operation();
Decorator decoratorB = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent()));
decoratorB.operation();
}
}
interface Component{
void operation();
}
class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("拍照...\n");
}
}
abstract class Decorator implements Component{
Component component;
public Decorator(Component component) {
this.component = component;
}
}
class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("添加美顏....");
component.operation();
}
}
class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation() {
System.out.println("添加濾鏡");
component.operation();
}
}
上面代碼的運行結果如下:

4.2、方式2
package decorator;
public class DecoratorPattern {
public static void main(String[] args) {
Circle circle = new Circle();
RedShapeDecorator redCircle = new RedShapeDecorator(circle);
Rectangle rectangle = new Rectangle();
RedShapeDecorator redRectangle = new RedShapeDecorator(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();
}
}
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape:Circle");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape:Rectangle");
}
}
abstract class ShapeDecorator implements Shape {
public Shape decoratedShape;
public ShapeDecorator(Shape decoratorShape) {
this.decoratedShape = decoratorShape;
}
@Override
public void draw() {
decoratedShape.draw();
}
}
class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratorShape) {
super(decoratorShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
上面代碼的運行結果如下:

五、裝飾者模式的應用
Java IO 庫採用了裝飾器模式(Decorator Pattern)和適配器模式(Adapter Pattern)的組合設計模式,其中InputStream是裝飾器模式中頂層的抽象類,FilterInputStream是裝飾器基類,BufferedInputStream是帶有緩衝區的裝飾器類,ObjectInputStream是可以讀取對象的裝飾器類,SequenceInputStream是可以順序讀取多個輸入Stream的裝飾器類,FileInputStream、ByteArrayInputStream則是被裝飾的類。 這些類的UML圖,如下所示:
