裝飾器模式,顧名思義主要就是裝飾的作用,在不改變原有類的基礎上,添加一些裝飾功能,比如有一個汽車,汽車可以跑,但是你想要一個漂亮的汽車,你可以把它裝飾成你喜歡的顏色,或者你還可以改造它的外形,爲了不影響原有對象的結構,我們可以定義一個裝飾類,所有的裝飾都通過裝飾類來進行,這就是裝飾器模式。
1.創建汽車接口,汽車屬性是可以跑。
public interface Car {
void run();
}
2.創建一個普通汽車類,並實現汽車接口。
public class NomalCar implements Car{
@Override
public void run() {
System.out.println("車具有跑的功能");
}
}
3.創建一個用於裝飾的抽象類。
public abstract class Decorator implements Car{
protected Car car;
public Decorator(Car car){
this.car = car;
}
public void run(){
car.run();
}
}
4.創建一個改變汽車外形的裝飾類。
public class ShapeDecorator extends Decorator{
public ShapeDecorator(Car car) {
super(car);
}
public void run(){
car.run();
setShape(car);
}
private void setShape(Car car){
System.out.println("給車設置成流線型");
}
}
5.測試類。
public class DecoratorTest {
public static void main(String[] args){
Car nomalCar = new NomalCar();
nomalCar.run();
Car shapeCar = new ShapeDecorator(new NomalCar());
shapeCar.run();
}
}
測試結果:
車具有跑的功能
車具有跑的功能
給車設置成流線型
從結果可以看出來,我們的外型裝飾類,把車成功裝飾成了流線型。
6.我們再對車的顏色進行裝飾。
public class ColorDecorator extends Decorator{
public ColorDecorator(Car car) {
super(car);
}
public void run(){
car.run();
setColor(car);
}
private void setColor(Car car){
System.out.println("把車設置成漂亮的紅色");
}
}
測試類:
public static void main(String[] args){
Car nomalCar = new NomalCar();
nomalCar.run();
Car colorCar = new ColorDecorator(new NomalCar());
colorCar.run();
}
測試結果:
車具有跑的功能
車具有跑的功能
把車設置成漂亮的紅色