[Patrones de diseño simple] Nueve, modo puente y ejemplo de Python

presentación profesional:

Separe "abstracción" de "implementación" para que puedan variar de forma independiente. Se implementa reemplazando la relación de herencia por la relación de composición, reduciendo así el grado de acoplamiento de las dos dimensiones variables de abstracción e implementación.

Introducción popular:  

La definición del patrón del puente parece clara, pero en realidad es vaga, ¡ porque el patrón del puente es uno de los patrones más complejos entre docenas de patrones de diseño ! Entonces, en primer lugar, el pensamiento no debe ser caótico.

Empiece a explicar:

       La "abstracción" en la definición anterior ya no se refiere al concepto abstracto de la clase abstracta anterior, y la "implementación" ya no es la implementación que entendíamos antes. El "abstracto" aquí se refiere a asuntos abstractos. Por ejemplo, lo último es un sedán BMW i8, luego "sedán" es algo abstracto, y "BMW i8" es su característica, por lo que puede usarse como una implementación); para otro ejemplo, si quieres un cuadrado blanco, entonces el cuadrado es algo abstracto, y el blanco es su característica, es decir, su implementación.

La abstracción se refiere a una cosa abstracta, y la implementación se refiere a un comportamiento o características específicas, que son dos dimensiones y pueden tener muchas variaciones, como trenes y camiones además de automóviles, y BMW además de BMW i8 X6 o incluso Mercedes-Benz. S600.

Roles incluidos en el modo puente :
abstracción: una clase abstracta que contiene atributos multidimensionales y llama directamente al rol realizado, que es el rol de nivel superior.

Rol abstracto extendido (RefinedAbstraction): una clase concreta que implementa la parte <abstract> de la interfaz <abstract role>.

Implementador: una clase abstracta que define la interfaz del rol implementado, que se puede llamar extendiendo el rol abstracto.

ConcreteImplementor: una clase concreta que contiene una implementación concreta de un rol realizado.

 

Escenario de aplicación:

     El objeto (clase) que se utilizará se compone de dos o más atributos de diferentes dimensiones, y estos atributos de diferentes dimensiones se pueden combinar para producir diferentes resultados, ¡entonces el modo puente puede ser útil!


código:

El siguiente código resuelve el ejemplo anterior.

# 桥接模式
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())

Trae problemas :

Para mí, no sé cómo traducir esto refinado. Muchos materiales usan roles abstractos extendidos, pero siento que las palabras no son expresivas, lo que afectará la comprensión.

La otra es la desventaja de este modo, que es el alto grado de abstracción, que requiere que el diseñador abstraiga en gran medida el escenario de la aplicación al diseñar y separe las partes de <abstracción> e <implementación>. La introducción de este modo conducirá a complejidad del sistema Directamente, utilícelo con precaución. Se recomienda simplificar el uso de este modo en escenarios reales, solo necesita separar los atributos de diferentes dimensiones, luego definir diferentes clases y finalmente usar el método de combinación para obtener la clase deseada.
 

por fin

Al aprender este modelo, leí la mayoría de los materiales domésticos, y básicamente me dijeron cómo realizar cuadrados y círculos de varios colores. . . Luego comenzó el modo puente. Después de leer el código, no sé por qué la forma debe escribirse en abstracción, y la forma debe usarse como implementación. Estaba realmente confundido. Aunque muchos materiales no son el mismo ejemplo, lo hicieron no explique por qué Al hacerlo, qué es exactamente lo que se puentea.

Por lo tanto, elijo Wikipedia.Si eres nuevo en el modo puente y quieres conocer información oficial de primera mano, te recomiendo el modo Wikipedia-puente .
 

 

Observaciones : para conocer el uso básico de las bibliotecas abc y six, consulte la introducción al final del artículo Simple Factory Pattern & Python Example, :)

Bienvenido a dejar un mensaje ~

 

Artículo de referencia:

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

Supongo que te gusta

Origin blog.csdn.net/sc_lilei/article/details/103406018
Recomendado
Clasificación