一、什麼是裝飾模式
裝飾模式又叫包模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關係的一個替換方案。
二、裝飾模式的結構
三、代碼實現
定義一個接口Car,所有的車都有一般性
package com.sinwao.decorator;
/**
* 車的基本功能
* @author Administrator
*
*/
public interface Car {
public void run();
public void show();
}
定義一個車的裝飾工廠,並且實現Car接口
package com.sinwao.decorator;
public abstract class CarDecorator implements Car{
private Car car;
public CarDecorator(Car car) {
this.car = car;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
具有一般性車的實現
package com.sinwao.decorator;
/**
* 跑車
* @author Administrator
*
*/
public class RunCar implements Car{
public void run() {
System.out.println("車跑起來");
}
public void show() {
this.run();
}
}
接下來對車添加新的功能
package com.sinwao.decorator;
public class SwimCarDecorator extends CarDecorator{
public SwimCarDecorator(Car car) {
super(car);
}
public void run() {
}
public void show() {
this.getCar().show();
this.swim();
}
private void swim() {
System.out.println("車加了潛水功能");
}
}
繼續擴展車的功能
package com.sinwao.decorator;
public class FlyCarDecorator extends CarDecorator{
public FlyCarDecorator(Car car) {
super(car);
// TODO Auto-generated constructor stub
}
public void run() {
// TODO Auto-generated method stub
}
public void show() {
this.getCar().show();
this.fly();
}
private void fly() {
System.out.println("車加了飛行功能");
}
}
測試代碼實現
package com.sinwao.decorator;
public class TestMain {
public static void main(String[] args) {
Car car = new RunCar();
car.show();
System.out.println("=======");
Car swimCar = new SwimCarDecorator(car);
swimCar.show();
System.out.println("=====");
Car flyCar = new FlyCarDecorator(car);
flyCar.show();
System.out.println("===潛水飛行功能的車===");
Car swimFlyCar = new FlyCarDecorator(swimCar);
//在已有的功能上,創造出更多功能的車
swimFlyCar.show();
}
}
結果輸出
四、裝飾模式的角色和職責
抽象組件角色:一個抽象接口,是被裝飾類和裝飾類的父接口
具體組件角色:爲抽象組件的實現類
抽象裝飾角色:包含一個組件的引用,並定義了與抽象組件一致的接口
具體裝飾角色:爲抽象裝飾角色的實現類。負責具體的裝飾
五、總結:
在項目實戰中經常被用到,因爲該模式的出現很好替代了類的繼承關係,並且擴展性較好。
所以該設計模式經常被開發者們使用。很多人只知道怎麼用,或者覺得別人設計的架構很好,
這就是學習設計模式的重要性。一個好的框架離不開設計模式,多思考,多總結,你也可以設計出很好的框架。