JavaRush /Java Blog /Random-JA /デコレーターのデザインパターンと例
Sbv239
レベル 23
Санкт-Петербург

デコレーターのデザインパターンと例

Random-JA グループに公開済み
デコレータ設計パターンを使用すると、同じクラスのオブジェクトの動作に影響を与えることなく、オブジェクトに機能を動的に追加できます。少し複雑に思えますが、コードを見るとすべてが明確になります。 特徴 - デコレータを使用すると、構造を変更せずに既存のオブジェクトに機能を追加できます。つまり、元のクラスは変更されません。 - デコレータ デザイン パターンは、既存のクラスのラッパーを提供する構造パターンです。 - デコレータ クラスは、次のように作成されます。元のクラスをラップし、元のクラスのメソッド シグネチャをそのまま維持しながら追加の機能を提供します。デコレータ設計パターンは、元のクラスに追加の責任をロードせずに分割するため、SOLID の単一責任の原則に従うために最もよく使用されます。デコレータ クラスへの組み込み - デコレータは、構造的に責任の連鎖パターン (責任の連鎖) とほぼ同様です。 次の重要な点を考慮する必要があります 。 - デコレータは、実行時にオブジェクトの動作を変更できる場合に便利です。このコードは保守と拡張が簡単です。- このパターンの欠点は、同じ型のデコレータ オブジェクトが多数使用されることです。 - デコレータ パターンは Java IO クラス (FileReader、BufferedReader など) でよく使用されます。 やること - インターフェイスの作成 - 具象の作成このインターフェイスの実装 - このインターフェイスを実装して、抽象デコレータを作成します。 - 抽象デコレータを継承する具象デコレータを作成しましょう。 - 具象デコレータを使用して、インターフェイスの具象実装を「装飾」します。 実装 : Shape インターフェイスと具象クラスを作成します。このインターフェースを実装するもの。次に、Shape インターフェイスを実装し、クラス フィールドとして Shape オブジェクトを持つ抽象デコレータ クラス ShapeDecorator を作成します。 デコレーターのデザインパターンと例 - 1 - Shape はインターフェイスの名前です。 - Rectangle、Triangle、Circle クラスは、Shape インターフェイスを実装する具象クラスになります。 - ShapeDecorator は、同じ Shape インターフェイスを実装する抽象デコレータ クラスです。 - RedShapeDecorator は、ShapeDecorator を実装する具象クラスです。 - デモはRedShapeDecorator を使用して Shape オブジェクトを装飾するデモ クラス ステップ 1 : Shape インターフェイスを作成する
public interface Shape {
    void draw();
}
ステップ 2 : このインターフェースの実装をいくつか作成しましょう。以下の例では円しかありませんが、実際にはさらに長方形と三角形をいくつか作成します。
public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("Я круг!");
    }
}
ステップ 3 : Shape インターフェースを実装する抽象デコレータを作成する
public abstract class ShapeDecorator implements Shape {

    protected Shape decoratedShape;

    //Конструктор, принимающий an object Shape
    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    public void draw() {
        decoratedShape.draw();
    }
}
ステップ 4 : 抽象クラスを継承する具体的なデコレータ クラスを作成する
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("Сообщение от RedShapeDecorator. Цвет границы: красный");
    }
}
ステップ 5 : RedShapeDecorator を使用してオブジェクトに色を付ける
public class Demo {
    public static void main(String[] args)
    {
        Shape circle = new Circle();
        Shape redCircle= new RedShapeDecorator(new Circle());
        Shape redRectangle= new RedShapeDecorator(new Rectangle());
        Shape redTriangle = new RedShapeDecorator(new Triangle());

        System.out.println("\nОбычный круг:");
        circle.draw();

        System.out.println("\nКруг с красной границей:");
        redCircle.draw();

        System.out.println("\nПрямоугольник с красной границей:");
        redRectangle.draw();

        System.out.println("\nТреугольник с красной границей:");
        redTriangle.draw();
    }
}
ステップ 6 : コンソールを見て喜ぶ
Обычный круг:
Я круг!

Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный

Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный

Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
例としてデコレータ設計パターンを分析した結果、次の場合にその使用が正当であると結論付けることができます。 - オブジェクトの動作や状態を追加、改善、あるいは削除したい場合 - 単に機能を変更したい場合クラスの 1 つの特定のオブジェクトを変更し、残りは変更しないでください。ありがとうございます。 プロジェクト ファイルを含むリポジトリgeeksforgeeks.org サイトの 記事 に基づく初心者 Java 開発者のための ブログ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION