Java設計模式
Java工廠設計模式
Java抽象工廠模式
Java單例模式
Java建造者(Builder)模式
Java原型模式
Java適配器模式
Java橋接模式
Java過濾器模式(條件模式)
Java組合模式
Java裝飾模式
Java門面模式(或外觀模式)
Java享元模式(Flyweight Pattern)
Java責任鏈模式
Java命令模式
Java迭代器模式
Java中介者模式(Mediator Pattern)
Java解釋器模式
Java備忘錄模式
Java觀察者模式
Java狀態模式
Java空對象模式
Java策略模式
Java模板模式
Java訪問者模式
Java MVC模式
Java業務代理模式
Java組合實體模式
Java數據訪問對象模式
Java前端控制器模式
Java攔截過濾器模式
Java服務定位器模式
Java傳輸對象模式
Java裝飾模式
裝飾器模式允許用戶向現有對象添加新功能而不改變其結構。 這種類型的設計模式屬於結構模式,因爲此模式充當現有類的包裝器。
此模式創建一個裝飾器類,它包裝原始類並提供附加功能,保持類方法簽名完整。
我們通過以下示例展示裝飾器模式的使用,其中我們將用一些顏色裝飾形狀而不改變形狀類。
實現實例
在這個實例中,將創建一個Shape
接口和實現Shape
接口的具體類。然後再創建一個抽象裝飾器類-ShapeDecorator
,實現Shape
接口並使用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();
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