意図:オブジェクトにいくつかの追加の責任を動的に追加すること。デコレータパターンは、機能の追加という点でサブクラス化よりも柔軟性があります。
主な解決策:一般に、クラスを拡張するために、継承を使用して実装することがよくあります。継承はクラスに静的機能を導入し、拡張関数の増加に伴い、サブクラスは非常に膨張します。
使用する場合:多くのサブクラスを追加せずにクラスを拡張します。
それを解決する方法:特定の機能的責任を分割し、同時にデコレータパターンを継承します。
キーコード:1。Componentクラスは抽象的な役割として機能するため、具体的に実装しないでください。2.変更されたクラスは、Componentクラスを参照および継承し、特定の拡張クラスが親クラスのメソッドをオーバーライドします。
インターフェイスを作成します。
Shape.java
public interface Shape {
void draw();
}
ステップ2
インターフェイスを実装するエンティティクラスを作成します。
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
ステップ
3Shapeインターフェイスを実装する抽象デコレータクラスを作成します。
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
ステップ
4ShapeDecoratorクラスを拡張するエンティティデコレータクラスを作成します。
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
ステップ
5RedShapeDecoratorを使用して、Shapeオブジェクトを装飾します。
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}