デザインパターンの「デコレーターパターン」

デコレータパターンとは何ですか

デコレーター パターンは、元のオブジェクトを動的にラップする構造的なデザイン パターンです。デコレータ パターンは、既存のクラスの機能を追加または変更することで、元のクラスを変更せずにその機能特性を動的に拡張できます。このパターンはラッパー パターン、つまり、オブジェクトの合成を使用して元のオブジェクトに機能拡張を提供する方法です。
追加の責任をオブジェクトに動的に追加します。デコレータ パターンは、機能を追加するという点でサブクラス化よりも柔軟です。

デコレータ パターンを使用する理由

一般に、クラスを拡張するには継承を使用することがよくあります。これは、継承によってクラスに静的な機能が導入され、拡張機能の増加に伴ってサブクラスが拡張されるためです。
デコレータ パターンを使用すると、継承を通じて機能拡張を実装するのではなく、より柔軟かつ動的な方法でオブジェクトに機能機能を追加できます。デコレータ パターンを使用すると、コードの繰り返しをできる限り減らし、コードの再利用性と保守性を向上させることができます。

仕事のどこで使いますか

多くのサブクラスを追加せずにクラスを拡張します。
Android では、デコレータ パターンはシステム内のさまざまなビューの Drawable で広く使用されています。たとえば、LayerDrawableを使用して複数のDrawableの組み合わせを実現したり、透明度や回転角度などを変更することで動的な効果を実現したりすることもできます。

デザインのアイデア

デコレータ パターンの中心となるアイデアは、複数のデコレータを通じてオブジェクトの機能特性を動的に拡張することです。デコレータ パターンには 4 つの役割があります。

1) 抽象コンポーネント (コンポーネント): オブジェクトが実装する必要があるインターフェイスを定義します。

2) ConcreteComponent: 抽象コンポーネントのインターフェイスを実装し、拡張する必要がある基本実装を定義します。

3) 抽象デコレーター (Decorator): コンポーネントから継承され、コンポーネントの機能を拡張できるようにコンポーネントのインスタンスを保持する必要があります。

4) 具象デコレーター (ConcreteDecorator): 抽象デコレーターのインターフェースを実装し、コンポーネントの実際の機能を拡張します。

コード

Android の一般的な Drawable デコレータの実装コードを以下に示します。

public class CircleDrawable extends Drawable {
    
    
    private Paint mPaint;
    private Drawable mDrawable;

    public CircleDrawable(Drawable drawable) {
    
    
        mDrawable = drawable;
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.FILL);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
    
    
        Rect bounds = getBounds();
        canvas.drawCircle(bounds.centerX(), bounds.centerY(),
                Math.min(bounds.width(), bounds.height()) / 2, mPaint);
        mDrawable.setBounds(bounds);
        mDrawable.draw(canvas);
    }

    @Override
    public void setAlpha(int alpha) {
    
    
        mDrawable.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
    
    
        mDrawable.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
    
    
        return mDrawable.getOpacity();
    }
}

この例では、CircleDrawable は Drawable のインスタンスを保持し、Drawable の円形クリッピングの機能を拡張するデコレーターです。CircleDrawable は、Drawable を継承してそのインターフェイスを実装することにより、Drawable の機能を動的に拡張でき、複数のデコレータをネストしてより複雑な機能を実現することもできます。

要約する

デコレータ パターンは、オブジェクトの機能を拡張するための柔軟で動的なデザイン パターンです。Android では、さまざまなコントロールの外観、動的効果、その他の機能特性の拡張を実現するために、デコレーター モードが View の Drawable で広く使用されています。デコレータ パターンは、抽象コンポーネント、具体コンポーネント、抽象デコレータ、具体デコレータの 4 つの役割を通じて機能特性の動的な拡張を実現します。デコレータ パターンを使用すると、コードの繰り返しをできる限り減らし、コードの再利用性と保守性を向上させることができます。

おすすめ

転載: blog.csdn.net/weixin_45112340/article/details/129777954