設計模式-裝飾器模式(Decorator)
阿新 • • 發佈:2018-12-16
裝飾器模式
定義:用於替代繼承,無需通過繼承增加子類就能擴充套件物件的新功能。
作用:用於包裝原有的類,並在保持類方法簽名完整性的前提下,提供額外的功能。
優劣:
- 優點:
- 裝飾類和被裝飾類可以獨立發展,不會耦合,裝飾器模式是繼承的一個替代方案,實現動態擴充套件功能。
- 缺點:
- 多層裝飾比較複雜
與代理模式區別:
裝飾器模式是為了增強功能,而代理模式是為了加以控制
用代理模式,代理類(proxy class)可以對它的客戶隱藏一個物件的具體資訊。因此,當使用代理模式的時候,我們常常在一個代理類中建立一個物件的例項,客戶對真實物件不可見。
當我們使用裝飾器模式的時候,我們通常的做法是將原始物件作為一個引數傳給裝飾者的構造器,來對原有物件進行功能擴充套件。
使用代理模式,代理和真實物件之間的的關係通常在編譯時就已經確定了,而裝飾者能夠在執行時遞迴地被構造。
應用例項:Java IO設計
示意圖:
類說明:
- Shape:圖形介面
- Circle:實體類1
- Rectangle:實體類2
- ShapeDecorator:實現了Shape介面的抽象裝飾類,Shape物件為其例項物件
- RedShapeDecorator,BoldShapeDecorator:實現了ShapeDecorator類的功能擴充套件實體類
- DecoratorDemo:測試主類
示例:
package designPattern.decorator;
public interface Shape {
void draw();
}
package designPattern.decorator;
public class CircleShape implements Shape{
@Override
public void draw() {
System.out.println("畫圓形圖片");
}
}
package designPattern.decorator; public class RectangleShape implements Shape{ @Override public void draw() { System.out.println("畫矩形圖片"); } }
package designPattern.decorator;
public abstract class ShapeDecorator implements Shape{
protected Shape shape;
public ShapeDecorator(Shape shapeDecorator) {
this.shape = shapeDecorator;
}
public void draw() {
shape.draw();
}
}
package designPattern.decorator;
public class RedShapeDecorator extends ShapeDecorator{
public RedShapeDecorator(Shape shapeDecorator) {
super(shapeDecorator);
}
@Override
public void draw() {
super.draw();
setRedColor();
}
void setRedColor() {
System.out.println("給圖形塗上紅色");
}
}
package designPattern.decorator;
public class BoldShapeDecorator extends ShapeDecorator{
public BoldShapeDecorator(Shape shapeDecorator) {
super(shapeDecorator);
}
@Override
public void draw() {
super.draw();
setBoldBorder();
}
void setBoldBorder() {
System.out.println("給圖形邊框加粗");
}
}
package designPattern.decorator;
public class DecoratorDemo {
public static void main(String[] args) {
System.out.println("---------畫圓----------");
CircleShape shape = new CircleShape();// 圓
// Shape shape = new RectangleShape();// 矩形
shape.draw();
System.out.println("---------畫圓並塗紅色----------");
Shape redShape = new RedShapeDecorator(shape);
redShape.draw();
System.out.println("----------畫圖並邊框加粗---------");
Shape boldShape = new BoldShapeDecorator(shape);
boldShape.draw();
System.out.println("----------畫圖,然後塗紅色,最後邊框加粗---------");
Shape redThanBoldShape = new BoldShapeDecorator(new RedShapeDecorator(shape));
redThanBoldShape.draw();
System.out.println("----------畫圖,然後邊框加粗,最後塗紅色---------");
Shape boldThanRedShape = new RedShapeDecorator(new BoldShapeDecorator(shape));
boldThanRedShape.draw();
}
}
執行結果:
---------畫圓----------
畫圓形圖片
---------畫圓並塗紅色----------
畫圓形圖片
給圖形塗上紅色
----------畫圖並邊框加粗---------
畫圓形圖片
給圖形邊框加粗
----------畫圖,然後塗紅色,最後邊框加粗---------
畫圓形圖片
給圖形塗上紅色
給圖形邊框加粗
----------畫圖,然後邊框加粗,最後塗紅色---------
畫圓形圖片
給圖形邊框加粗
給圖形塗上紅色