桥接模式-java实现

9 篇文章 0 订阅
6 篇文章 0 订阅

桥接模式

桥接模式的本质,是解决一个基类,存在多个扩展维度的的问题。

比如一个图形基类,从颜色方面扩展和从形状上扩展,我们都需要这两个维度进行扩展,这就意味着,我们需要创建一个图形子类的同时,还要以这个颜色维度进行区分,假如有两个颜色,那么创建一个图形基类,就需要构建两个不同颜色的子类,这样代码非常的冗余且不好维护,随着扩展的增多,子类会越来越多。

image.png

 这时候桥接模式就派上用场了,我们只保留一个维度的扩展作为主维度,并保存着另一个维度的引用,这个引用就像一条桥梁一样,因此称之为桥接模式,另一个维度的抽象可以随意扩展,不会造成主维度的代码有任何的冗余和影响。

image.png

 

适用环境

一个类存在两个(或多个)独立变化的维度,且这两个(多个)维度都需要进行扩展。

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

 uml图

 

其中包含如下角色:

Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个 Implementor(实现类接口)类型的对象并可以维护该对象,它与 Implementor 之间具有关联关系。

RefinedAbstraction(提炼抽象类):可以理解为,扩展的主维度,扩充由 Abstraction 定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。

Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor 接口仅提供基本操作,而 Abstraction 定义的接口可能会做更多更复杂的操作。Implementor 接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在 Abstraction 中不仅拥有自己的方法,还可以调用到 Implementor 中定义的方法,使用关联关系来替代继承关系。

ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现,在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给抽象类具体的业务操作方法。

 

 

实例

我们就以上述形状与颜色这两个独立的维度来实现给不同的形状刷上不同颜色的例子来讲解:
ColorAPI :用于画各种颜色的接口

我们就以上述形状与颜色这两个独立的维度来实现给不同的形状刷上不同颜色的例子来讲解:

实现化角色


ColorAPI :用于画各种颜色的接口

public interface ColorApi {
    //抽象的上色方法
    void paint();
}

具体实现化角色

ColorApiBlue:画上蓝色的实现类

public class ColorApiBlue implements ColorApi{

    @Override
    public void paint() {
        System.out.println("画上蓝色...");
    }
}

ColorApiRed:画上红色的实现类

public class ColorApiRed implements ColorApi{
    @Override
    public void paint() {
        System.out.println("画上红色...");
    }
}

抽象化角色

下面来规划基础图形抽象类Shape

public abstract class Shape {
    //保存对颜色维度实现化角色的应用
    protected ColorApi colorApi;
    //进行颜色渲染操作,这里只进行一个规范
    public abstract void paint();
    //注入颜色实现化角色
    public void setColorApi(ColorApi colorApi) {
        this.colorApi = colorApi;
    }
}
  • 修正抽象化角色

往形状方面扩展的子类

Circle

public class Circle extends Shape{
    @Override
    public void paint() {
        System.out.println("我是圆形");
        super.colorApi.paint();
    }
}

Square

public class Square extends Shape{
    @Override
    public void paint() {
        //开始进行修正扩展
        //调用保存的颜色维度实现化角色的染色方法
        super.colorApi.paint();
    }
}

客户端代码

public class Client {
    public static void main(String[] args) {
        //创建圆形
        Shape circle=new Circle();
        //创建红色颜料的实现化角色
        ColorApi red=new ColorApiRed();
        //将颜料交给圆形
        circle.setColorApi(red);
        //上色
        circle.paint();
    }

}

输出 

 现在再来看“将抽象部分与他的实现部分分离”这句话,实际上就是在说实现系统可能有多个角度分类(例如例子中的形状与颜色),每一种分类都有可能变化,那么把这种多角度分离出来让他们独立变化,减少他们之间的耦合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很高兴为您提供有关桥接模式Java项目实例。桥接模式是一种结构性设计模式,可用于将抽象与实现解耦。 以下是一个简单的桥接模式Java项目实例: 1.先定义一个 Shape 接口和一个 Drawing 接口,如下所示: ```java public interface Shape { public void draw(); } public interface Drawing { public void drawCircle(int x, int y, int radius); public void drawRectangle(int x1, int y1, int x2, int y2); } ``` 2.然后实现具体的 Shape 类和 Drawing 类,如下所示: ```java public class CircleShape implements Shape { private int x, y, radius; private Drawing drawing; public CircleShape(int x, int y, int radius, Drawing drawing) { this.x = x; this.y = y; this.radius = radius; this.drawing = drawing; } public void draw() { drawing.drawCircle(x, y, radius); } } public class RectangleShape implements Shape { private int x1, y1, x2, y2; private Drawing drawing; public RectangleShape(int x1, int y1, int x2, int y2, Drawing drawing) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.drawing = drawing; } public void draw() { drawing.drawRectangle(x1, y1, x2, y2); } } public class DrawingImpl implements Drawing { public void drawCircle(int x, int y, int radius) { System.out.println("Drawing circle at (" + x + ", " + y + ") with radius " + radius); } public void drawRectangle(int x1, int y1, int x2, int y2) { System.out.println("Drawing rectangle from (" + x1 + ", " + y1 + ") to (" + x2 + ", " + y2 + ")"); } } ``` 3.最后,我们可以使用这些类来画出不同的形状,如下所示: ```java public static void main(String[] args) { Drawing drawing = new DrawingImpl(); Shape circle = new CircleShape(10, 10, 5, drawing); circle.draw(); Shape rectangle = new RectangleShape(20, 20, 30, 30, drawing); rectangle.draw(); } ``` 这是一个简单的桥接模式Java项目实例。它演示了如何将抽象和实现分离,使得它们可以独立进行扩展。当我们需要添加新的形状或绘图方式时,只需要实现相应的类即可,而不用改变现有类的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔雀南飞梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值