La reencarnación de Bajie resultó ser un patrón de diseño de Java: patrón de puente

Ejemplo

Desarrolle un programa de dibujo que pueda dibujar gráficos en varios colores y formas. Utilice el pensamiento orientado
a objetos para diseñar gráficos.
Análisis:
1. Por ejemplo, hay tres colores de rojo, amarillo y azul.
2. Las formas son cuadradas, círculo y triángulo
. El círculo puede ser un círculo rojo, un círculo amarillo o un círculo azul.
Inserte la descripción de la imagen aquí
Como puede ver en lo anterior, hay dos cambios:
1. La forma
2. El color
puede cambiar en dos dimensiones Construye un puente entre estas dos dimensiones y deja que se puedan fusionar, es el modo puente, entonces, ¿cómo construirlo?
Debe comenzar desde dos lugares:
1: Abstracción abstraer
cada dimensión por separado y extraer las partes comunes
Inserte la descripción de la imagen aquí
2: Combinación Combinar
abstracciones juntas (puente)
Inserte la descripción de la imagen aquí

Ejemplo de código

Las formas y colores abstractos y las clases correspondientes son las siguientes:
Clase abstracta de forma: contiene instancias de color

public abstract class Shape {
    
    

    protected Color color;

    public Shape(Color color) {
    
    
        this.color = color;
    }

    /** 画图形 */
    abstract void draw();
}

Interfaz de color:

public interface Color {
    
    

    /** 上色 */
    void coloring();
}

Clases de implementación correspondientes a diferentes formas:

public class Circle extends Shape {
    
    

    public Circle(Color color) {
    
    
        super(color);
    }

    @Override
    public void draw() {
    
    
        this.color.coloring();
        System.out.print("圆");
    }
}
public class Rect extends Shape {
    
    

    public Rect(Color color) {
    
    
        super(color);
    }

    @Override
    public void draw() {
    
    
        this.color.coloring();
        System.out.print("矩形");
    }
}
public class Triangle extends Shape {
    
    

    public Triangle(Color color) {
    
    
        super(color);
    }

    @Override
    public void draw() {
    
    
        this.color.coloring();
        System.out.print("三角形");
    }
}

Clases de implementación correspondientes a diferentes colores:

public class Red implements Color {
    
    
    @Override
    public void coloring() {
    
    
        System.out.print("红色-》");
    }
}
public class Yellow implements Color {
    
    
    @Override
    public void coloring() {
    
    
        System.out.print("黄色-》");
    }
}
public class Blue implements Color {
    
    
    @Override
    public void coloring() {
    
    
        System.out.print("蓝色-》");
    }
}

Categoría de prueba:

public class Test {
    
    

    public static void main(String[] args) {
    
    
        //画一个红色的圆
        Shape redCircle = new Circle(new Red());
        redCircle.draw();
        System.out.println();

        //画一个黄色的矩形
        Shape yellowRect = new Rect(new Yellow());
        yellowRect.draw();
        System.out.println();

        //画一个蓝色的三角形
        Shape blueTriangle = new Triangle(new Blue());
        blueTriangle.draw();
    }
}

Inserte la descripción de la imagen aquí
Diagrama de clase:
Inserte la descripción de la imagen aquí

Modo Puente

definición

Combine cambios en múltiples dimensiones de manera abstracta. Abstracción orientada al usuario. Desacoplamiento entre dimensiones, libre de cambios

intención

Separe la parte abstracta de la parte de implementación para que se puedan cambiar de forma independiente

Principalmente resuelve el problema

En una variedad de situaciones que pueden cambiar, el uso de la herencia causará problemas de explosión de clases y no funcionará bien para la expansión.

Cuándo usar

El sistema de realización puede tener múltiples clasificaciones de ángulos y cada ángulo puede cambiar

Pros y contras

ventaja:

  1. Separación de abstracción y realización
  2. Excelente escalabilidad
  3. Los detalles de implementación son transparentes para los clientes

Desventajas:
La introducción del modo puente aumentará la dificultad de comprender y diseñar el sistema. Dado que la relación de agregación se establece en la capa abstracta, los desarrolladores deben diseñar y programar para la abstracción.

Diagrama de clases:
Inserte la descripción de la imagen aquí
roles involucrados:

  1. Rol de abstracción: abstraer la definición dada y guardar una referencia al objeto realizado
  2. Rol de RefinedAbstraction: expanda el rol de abstracción, cambie y modifique la definición de abstracción por clase principal
  3. Rol de implementación (implementador): este rol proporciona la interfaz del rol de implementación, pero no proporciona una implementación específica.
  4. Rol ConcreteImplementor: Este rol da la realización concreta de la interfaz del rol de realización.

El código fuente correspondiente es el siguiente:

public abstract class Abstraction {
    
    

    protected Implementor implementor;

    public void operation(){
    
    
        implementor.operationImpl();
    }
}
public class RefinedAbstraction extends Abstraction {
    
    

    @Override
    public void operation() {
    
    
        super.operation();
    }
}
public abstract class Implementor {
    
    

    public abstract void operationImpl();
}
public class ConcreteImplementor extends Implementor {
    
    
    @Override
    public void operationImpl() {
    
    
        //do something......
    }
}

La historia de la reencarnación de Bajie

La historia de la reencarnación del mariscal Tianpeng como Zhu Bajie en "Journey to the West" es familiar para todos. Desde la perspectiva del modo puente, echemos un vistazo a esta historia:
si hay un alma, debe ser un personaje abstracto, mientras que el cuerpo es un carácter realizado. El cuerpo proporciona la realización de la función del alma.
Inserte la descripción de la imagen aquí
Papel abstracto: alma

public interface Soul {
    
    

    /** 灵魂 */
    void mySoul();
}

Corrija el papel abstracto:

public class SoulRefined1 implements Soul {
    
    

    private Body body;

    public SoulRefined1(Body body) {
    
    
        this.body = body;
    }

    @Override
    public void mySoul() {
    
    
        System.out.println("天蓬元帅");
        this.body.myBody();
    }
}
public class SoulRefined2 implements Soul {
    
    

    private Body body;

    public SoulRefined2(Body body) {
    
    
        this.body = body;
    }

    @Override
    public void mySoul() {
    
    
        System.out.println("飞禽走兽");
        this.body.myBody();
    }
}

Rol de realización: carne

public interface Body {
    
    

    /** 肉体 */
    void myBody();
}

Roles de implementación específicos:

public class ConcreteBody1 implements Body {
    
    

    @Override
    public void myBody() {
    
    
        System.out.println("转世成人");
    }
}
public class ConcreteBody2 implements Body {
    
    
    @Override
    public void myBody() {
    
    
        System.out.println("转世成猪");
    }
}

Categoría de prueba:

public class Test {
    
    

    public static void main(String[] args) {
    
    
        Body body = new ConcreteBody2();
        Soul soul = new SoulRefined1(body);
        soul.mySoul();
    }
}

Inserte la descripción de la imagen aquí
Diagrama de clase:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_34365173/article/details/108110858
Recomendado
Clasificación