9

アダプタデザインパターンは、クラス(Target)のインターフェイスをクライアントが期待する別のインターフェイス(Adaptee)に変換するために使用されます。アダプタを使用すると、互換性のないクラスを連携させることができます。これは、互換性のないインターフェイスのために他の方法では機能しませんでした。

アダプタパターンは、継承(アダプタパターンのクラスバージョン)とコンポジション(アダプタパターンのオブジェクトバージョン)の2つの方法で実装できます。

私の質問は、継承を使用して実装されるアダプタパターンのクラスバージョンについてです。

図面エディタの例を次に示します。

図1:

interface Shape   
{   
        Rectangle BoundingBox();   

        Manipulator CreateManipulator();   
}   

class TextView   
{   
        public TextView() { }   

        public Point GetOrigin() { }   

        public int GetWidth() { }   

        public int GetHeight() { }   
}  
interface Shape
{
        Rectangle BoundingBox();

        Manipulator CreateManipulator();
}

class TextView
{
        public TextView() { }

        public Point GetOrigin() { }

        public int GetWidth() { }

        public int GetHeight() { }
}

TextViewクラスを再利用してTextShapeを実装したいのですが、インターフェイスが異なるため、TextViewオブジェクトとShapeオブジェクトを同じように使用することはできません。

シェイプインターフェイスに準拠するようにTextViewクラスを変更する必要がありますか?おそらくそうではありません。

TextShapeは、次の2つの方法のいずれかで、TextViewインターフェイスを図形のインターフェイスに適合させることができます。

  1. ShapeのインターフェースとTextViewの実装(Adapterパターンのクラスバージョン)を継承する
  2. TextShapeオブジェクト内にTextViewインスタンスを作成し、TextViewインスタンス(アダプタパターンのオブジェクトバージョン)を使用してTextShapeのインターフェイスを実装します。

クラスアダプタ

図2:

interface Shape   
{   
    Rectangle BoundingBox();   

    Manipulator CreateManipulator();   
}   

class TextView   
{   
    public TextView() { }   

    public Point GetOrigin() { }   

    public int GetWidth() { }   

    public int GetHeight() { }   
}   

class TextShape : TextView, Shape   
{   
    public Rectangle BoundingBox()   
    {   
        Rectangle rectangle;   
        int x, y;   
        Point p = GetOrigin();   
        x = GetWidth();   
        y = GetHeight();   

        //...   

        return rectangle;   
    }  

    #region Shape Members   

    public Rectangle Shape.BoundingBox()   
    {   
        return new TextBoundingBox();   
    }   

    public Manipulator Shape.CreateManipulator()   
    {   
        return new TextManipulator();   
    }  

    #endregion   
}  

さて、質問です:-)。TextShapeはShape、特にTextViewから継承していますか?有効な「isa」関係ですか?そうでなければ、それはリスコフの置換原則に違反しませんか?

4

1 に答える 1

5

サブクラスに、スーパークラスにとって意味のない方法で動作する(スーパークラスの契約に違反する)何かがない限り、リスコフの置換原則に違反することはありません。もちろんこれは不完全なコードですが、その兆候は見られません。

これは単一責任の原則に違反する可能性がありますが、それがアダプターの実装における大きな懸念事項であるかどうかはわかりません。

私は一般的にデリゲートウェイを好みます。

于 2011-02-25T23:15:16.500 に答える