1. 程式人生 > >設計模式-裝飾器模式(Decorator)

設計模式-裝飾器模式(Decorator)

裝飾器模式

定義:用於替代繼承,無需通過繼承增加子類就能擴充套件物件的新功能。

作用:用於包裝原有的類,並在保持類方法簽名完整性的前提下,提供額外的功能。

優劣:

  1. 優點:
    • 裝飾類和被裝飾類可以獨立發展,不會耦合,裝飾器模式是繼承的一個替代方案,實現動態擴充套件功能。
  2. 缺點:
    • 多層裝飾比較複雜

與代理模式區別:

裝飾器模式是為了增強功能,而代理模式是為了加以控制

用代理模式,代理類(proxy class)可以對它的客戶隱藏一個物件的具體資訊。因此,當使用代理模式的時候,我們常常在一個代理類中建立一個物件的例項,客戶對真實物件不可見。

當我們使用裝飾器模式的時候,我們通常的做法是將原始物件作為一個引數傳給裝飾者的構造器,來對原有物件進行功能擴充套件。

使用代理模式,代理和真實物件之間的的關係通常在編譯時就已經確定了,而裝飾者能夠在執行時遞迴地被構造。

應用例項:Java IO設計

示意圖:
在這裡插入圖片描述

類說明:

  1. Shape:圖形介面
  2. Circle:實體類1
  3. Rectangle:實體類2
  4. ShapeDecorator:實現了Shape介面的抽象裝飾類,Shape物件為其例項物件
  5. RedShapeDecorator,BoldShapeDecorator:實現了ShapeDecorator類的功能擴充套件實體類
  6. 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();
		
	}

}

執行結果:

---------畫圓----------
畫圓形圖片
---------畫圓並塗紅色----------
畫圓形圖片
給圖形塗上紅色
----------畫圖並邊框加粗---------
畫圓形圖片
給圖形邊框加粗
----------畫圖,然後塗紅色,最後邊框加粗---------
畫圓形圖片
給圖形塗上紅色
給圖形邊框加粗
----------畫圖,然後邊框加粗,最後塗紅色---------
畫圓形圖片
給圖形邊框加粗
給圖形塗上紅色