Component: Definiert ein Interface, basically damit man einen Datentyp für die Ganzen anderen Klassen hat. ConcreteComponent: Ein reiner Component, von dem es am Ende nur einen gibt und der in beliebig viele Decorators eingepackt sein kann. Decorator: Eine abstrakte Klasse, die ein Component Objekt hält (Das 1 Objekt oder einen weiteren Decorator) und verschiedene Methoden, je nach anwendungsfall. Die hier implementierte Decorator Methode führt immer die selbe Methode des gespeicherten Components aus. ConcreteDecorator: Ein Decorator, der in seinen Methoden super.method() aufruft, und anschießend seinen Decorator Zweck ausführt.

Beispiel für das ganze “Methode des inneren Objekts aufrufen” Ding


Code Beispiel


Component:

public interface Car {  
    void upgrade();  
}

Concrete Component

public class Acura implements Car{  
    @Override  
    public void upgrade() {  
        System.out.println("Acura Base Model");  
    }  
}

Concrete Component

public class BMW implements Car{  
	  
    @Override  
    public void upgrade() {  
        System.out.println("BMW Base Model");  
    }  
}

Decorator

public abstract class CarDecorator implements Car{  
    private Car car;  
	  
    public CarDecorator(Car car) {  
        this.car = car;  
    }  
	  
    public void upgrade(){  
        this.car.upgrade();  
    };  
}

Concrete Decorator

public class CarNavigationDecorator extends CarDecorator{  
	
	public CarNavigationDecorator(Car car) {  
		super(car);  
	}  
	
	@Override  
	public void upgrade(){  
		super.upgrade();  
		System.out.println("Navi");  
	}  
}

Concrete Decorator

public class CarTireDecorator extends CarDecorator{  
	  
    public CarTireDecorator(Car car) {  
        super(car);  
    }  
	  
    @Override  
    public void upgrade(){  
        super.upgrade();  
        System.out.println("Alufelgen");  
    }  
}

Main

public class Main {  
    public static void main(String[] args) {  
        Car full = new CarNavigationDecorator(new CarTireDecorator(new BMW()));  
        full.upgrade();  
    }  
}