Modo 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.
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
2: Combinación Combinar
abstracciones juntas (puente)
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();
}
}
Diagrama de clase:
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:
- Separación de abstracción y realización
- Excelente escalabilidad
- 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:
roles involucrados:
- Rol de abstracción: abstraer la definición dada y guardar una referencia al objeto realizado
- Rol de RefinedAbstraction: expanda el rol de abstracción, cambie y modifique la definición de abstracción por clase principal
- Rol de implementación (implementador): este rol proporciona la interfaz del rol de implementación, pero no proporciona una implementación específica.
- 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.
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();
}
}
Diagrama de clase: