JAVA Bridge桥接模式
程序员文章站
2022-07-09 19:25:09
桥接模式一个复杂类中可能包括了多个维度的属性行为,桥接模式在逻辑上可以将这些维度进行分离,分离为抽象部分(接口)和实现(抽象类)部分。1.通过分离抽象部分和实现部分可使原本复杂的类各部分间解耦合,且更符合“单一职责原则”。2.抽象部分和实现部分这两个部分,可以独立地变化、独立扩展,通过*组合产生新的类。这种通过(聚合和关联关系)产生类的方式较传统通过继承产生新类的方式,扩展性更好,减少了系统中类,防止类爆炸问题。构建过程确定要设计的复杂类的维度。由抽象部分(Interface)和实现部分(Abst...
桥接模式
一个复杂类中可能包括了多个维度的属性行为,桥接模式在逻辑上可以将这些维度进行分离,分离为抽象部分(接口)和实现(抽象类)部分。1.通过分离抽象部分和实现部分可使原本复杂的类各部分间解耦合,且更符合“单一职责原则”。2.抽象部分和实现部分这两个部分,可以独立地变化、独立扩展,通过*组合产生新的类。这种通过(聚合和关联关系)产生类的方式较传统通过继承产生新类的方式,扩展性更好,减少了系统中类,防止类爆炸问题。
构建过程
- 确定要设计的复杂类的维度。由抽象部分(Interface)和实现部分(Abstract)组成。
- 抽象部分Interface。通过关联关系 关联实现部分。(由于抽象部分和实现部分最后要通过组合形成一个整体,因此两部分间要发生关系,可通过参数将实现部分的引用传入Interface方法,以实现抽象部分的行为方法作用于实现部分的对象)
- 实现部分Abstract。内部聚合了抽象部分的引用,通过聚合持有Interface的引用对象。
- 具体实现类分别实现Abstract和Interface。
- 具体实现类相互组合。实现全新的对象
DEMO
一个复杂类”各种颜色的形状“,通过桥接模式进行实现。(对应上面的构建过程进行解释)。
- 复杂类”各种颜色的形状“进行维度分离,分立为实现部分 Abstract Shape和抽象部分Interface Color。
- 抽象部分Interface Color的接口方法bepaint中持有shape的对象引用,以保证interface的行为可作用于shape。
- 实现部分 Abstract Shape。内部聚合封装了抽象部分Color的引用,持有了抽象部分Interface Color的引用对象(拥有了Color的行为)。
- 具体实现类分别继承、实现了Shape和Color。包括各种形状类,各种颜色类。
- 通过组合各种形状类,各种颜色类,获得构建的复杂新对象。(Shape类的Circle具体类中的Draw方法可通过持有Color对象引用调用其bepaint方法,实现复合类的行为。)
类图:搬一张别人的类图,自己懒得画了
主方法:
//DEMO桥接模式
//Color和抽象类shape 在两个维度上相互组合。
//Color类,在接口中传入Shape对象,修改Shape的对象
//Shape类,聚合了一个Color对象
public class Bridge_v1 {
public static void main(String[] args) {
Color black = new Black();
Color gray = new Gray();
Color white = new White();
Shape circle = new Circle();
Shape rectangle = new Rectangle();
Shape square = new Square();
circle.SetColor(black);
rectangle.SetColor(gray);
square.SetColor(white);
circle.Draw();
rectangle.Draw();
square.Draw();
}
}
所谓的“抽象部分”,Color接口:
//维度:Color
//接口类,通过形参数和Shape关联
interface Color {
void PaintShape(Shape shape);
void PaintColor();
}
所谓的“实现部分”,Shape抽象类:
//维度:Shape
//抽象类,聚合了Color接口
abstract class Shape {
Color color;
public abstract void SetColor(Color color);
public abstract void Draw();
}
Color具体实现类:
public class Black implements Color{
@Override
public void PaintShape(Shape shape) {
System.out.println(shape);
}
@Override
public void PaintColor()
{
System.out.print("Black ");
}
}
public class Gray implements Color{
@Override
public void PaintShape(Shape shape) {
System.out.println(shape);
}
@Override
public void PaintColor()
{
System.out.print("Gray ");
}
}
public class White implements Color{
@Override
public void PaintShape(Shape shape) {
System.out.println(shape);
}
@Override
public void PaintColor()
{
System.out.print("White ");
}
}
Shape具体实现类:
public class Circle extends Shape{
@Override
public void SetColor(Color color) {
this.color = color;
}
@Override
public void Draw() {
this.color.PaintColor();
this.color.PaintShape(this);
}
@Override
public String toString() {
return "Circle";
}
}
public class Rectangle extends Shape{
@Override
public void SetColor(Color color) {
this.color = color;
}
@Override
public void Draw() {
this.color.PaintColor();
this.color.PaintShape(this);
}
@Override
public String toString() {
return "Rectangle";
}
}
public class Square extends Shape{
@Override
public void SetColor(Color color) {
this.color = color;
}
@Override
public void Draw() {
this.color.PaintColor();
this.color.PaintShape(this);
}
@Override
public String toString() {
return "Square";
}
}
使用场景
- 多维度的复杂类的重构。复杂类分解为多个单独维度的抽象,使得每个维度职责单一,解耦合,扩展性好。再通过组合实现原复杂类的逻辑。
- 要设计的类包含多维度属性。可使用桥接模式先进行维度分离,再进行组合。
- 通过继承扩展而产生大量类的场景,使用桥接可减少类数量,防止类爆炸。
优点
- 抽象和实现的分离。
- 优秀的扩展能力。
- 实现细节对客户透明。
本文地址:https://blog.csdn.net/qq_29047189/article/details/107486804