java設計模式---裝飾模式篇

一、什麼是裝飾模式

裝飾模式又叫包模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關係的一個替換方案。


二、裝飾模式的結構


三、代碼實現

定義一個接口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();
	}

}


結果輸出


四、裝飾模式的角色和職責

抽象組件角色:一個抽象接口,是被裝飾類和裝飾類的父接口

具體組件角色:爲抽象組件的實現類

抽象裝飾角色:包含一個組件的引用,並定義了與抽象組件一致的接口

具體裝飾角色:爲抽象裝飾角色的實現類。負責具體的裝飾


五、總結:

在項目實戰中經常被用到,因爲該模式的出現很好替代了類的繼承關係,並且擴展性較好。

所以該設計模式經常被開發者們使用。很多人只知道怎麼用,或者覺得別人設計的架構很好,

這就是學習設計模式的重要性。一個好的框架離不開設計模式,多思考,多總結,你也可以設計出很好的框架。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章