[プレーンなデザインパターン] 9 つ、ブリッジモード & Python の例

専門的なプレゼンテーション:

「抽象化」を「実装」から分離して、それぞれが独立して変更できるようにします。これは、継承関係を合成関係に置き換えることによって実装され、それによって抽象化と実装の 2 つの可変次元の結合度が減少します。

人気の紹介:  

ブリッジ パターンの定義は明確に見えますが、実際には曖昧です。なぜなら、ブリッジ パターンは数十のデザイン パターンの中で最も複雑なパターンの 1 つだからですしたがって、まず第一に、思考が混沌とすべきではありません。

説明を開始します。

       上記の定義における「抽象化」は、以前の抽象クラスの抽象概念を指すものではなくなり、「実装」は、以前に理解されていた実装ではなくなりました。ここでいう「抽象」とは抽象的なことを指します。例えば、究極のものはBMW i8セダンであれば、「セダン」は抽象的なもの、「BMW i8」はその特徴なので実装として使えます)。別の例として、白い正方形が必要な場合、その正方形は抽象的なものであり、白はその特性、つまり実装です。

抽象化は抽象的なものを指し、実装は特定の動作や特性を指します。これらは 2 次元であり、車に加えて電車やトラック、BMW に加えて BMW i8 X6、さらにはメルセデス・ベンツなど、さまざまなバリエーションがあります。 S600。

ブリッジ モードに含まれるロール:
抽象化: 多次元属性を含み、最上位のロールである実現されたロールを直接呼び出す抽象クラス。

拡張抽象ロール (RefinedAbstraction): <abstract role> インターフェイスの <abstract> 部分を実装する具象クラス。

インプリメンタ: 実装されたロールのインターフェイスを定義する抽象クラス。抽象ロールを拡張することで呼び出すことができます。

ConcreteImplementor: 実現されたロールの具体的な実装を含む具体的なクラス。

 

アプリケーションシナリオ:

     使用するオブジェクト (クラス) が 2 つ以上の異なる次元の属性で構成されており、これらの異なる次元の属性を組み合わせて異なる結果を生成できる場合、ブリッジ モードが便利です。


コード:

次のコードは上記の例を解決します

# 桥接模式
import abc, six


# step-1: 定义<实现化>抽象类
@six.add_metaclass(abc.ABCMeta)
class Implementor:
    @abc.abstractmethod
    def get_brand(self): pass


# step-2: 定义具体<实现化>类
class ConcreteImplementor(Implementor):
    def get_brand(self):
        return 'BMW i8'


# step-3: 定义一个顶层的抽象角色,Car
@six.add_metaclass(abc.ABCMeta)
class AbstractCar:
    _implementor: Implementor = None

    def __init__(self, implementor: Implementor):
        self._implementor = implementor

    # 抽象角色直接调用<实现化>角色的方法
    def get_brand(self):
        return self._implementor.get_brand()

    @abc.abstractmethod
    def get_abstraction_item(self): pass


# step-4: 定义扩展<抽象>类: Refined Abstraction
class RefinedAbstractionHomeCar(AbstractCar):
    def __init__(self, implementor: Implementor):
        super(RefinedAbstractionHomeCar, self).__init__(implementor)

    def get_brand(self):
        # <实现化>信息直接调用父类的接口
        return super().get_brand()

    def get_abstraction_item(self):
        """主要返回<抽象化>事物"""
        return 'home car'  # 暂代指轿车


# step-4.1: 定义扩展<抽象>类: Refined Abstraction
class RefinedAbstractionTruck(AbstractCar):
    def __init__(self, implementor: Implementor):
        super().__init__(implementor)

    def get_brand(self):
        # <实现化>信息直接调用父类的接口
        return super().get_brand()

    def get_abstraction_item(self):
        """主要返回<抽象化>事物"""
        return 'Truck'  # 卡车


if __name__ == '__main__':
    implementor = ConcreteImplementor()
    refinedHomeCar = RefinedAbstractionHomeCar(implementor)

    '''
    扩展抽象类的意义在于:通过组合不同的<抽象化>属性,如轿车、卡车,和<实现化>属性,如BMW i8等
    组合出具有不同属性(方法)的结果类,供使用
    '''
    print(refinedHomeCar.get_brand())
    print(refinedHomeCar.get_abstraction_item())

    refinedTruck = RefinedAbstractionTruck(implementor)

    print(refinedTruck.get_brand())
    print(refinedTruck.get_abstraction_item())

問題を引き起こす:

多くの資料では拡張された抽象的な役割が使用されていますが、言葉が表現力に乏しく、理解に影響を与えると感じます。

もう 1 つは、このモードの欠点であり、抽象度が高いため、設計者はアプリケーション シナリオを高度に抽象化して設計する必要があり、<抽象化> 部分と <実装> 部分を分離する必要があります。システムが複雑なので、使用には注意してください。実際のシナリオでは、このモードの使用を簡素化することをお勧めします。必要なのは、異なるディメンションの属性を分離し、次に異なるクラスを定義し、最後に組み合わせメソッドを使用して目的のクラスを取得することだけです。
 

やっと

このモデルを学ぶとき、私はほとんどの国内の資料を読み、基本的にさまざまな色の正方形と円を実現する方法を教えました。その後、ブリッジモードが始まりました。コードを読んだ後、なぜ形状を抽象化して記述し、その形状を実装として使用する必要があるのか​​わかりません。非常に混乱しました。多くの資料は同じ例ではありませんが、実際にはそうでしたそうすることで、具体的に何が橋渡しされるのかは説明されません。

したがって、私は Wikipedia を選択しますが、ブリッジ モードが初めてで公式の情報を直接知りたい場合は、Wikipedia-ブリッジ モードをお勧めします。
 

 

備考: abc および 6 つのライブラリの基本的な使用法については、「シンプルなファクトリ パターンと Python の例」の記事の最後にある概要を参照してください。:)

メッセージを残してください~

 

参考記事:

https://zh.wikipedia.org/wiki/%E6%A9%8B%E6%8E%A5%E6%A8%A1%E5%BC%8F

おすすめ

転載: blog.csdn.net/sc_lilei/article/details/103406018