结构型模式-桥接模式
Posted zhaoqiang-lab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式-桥接模式相关的知识,希望对你有一定的参考价值。
桥接模式
原文链接:https://www.cnblogs.com/adamjwh/p/9033548.html
一、什么是桥接模式
? 桥接模式,又叫做桥梁模式,顾名思义,就是有座“桥”,那这座桥是什么呢?就是一条聚合线(下方UML图),比如我们下面会举的例子:手机又手机品牌和手机游戏等等,每个手机品牌都有多款手机游戏,那是不是二者之间就聚合了?这就是合成、聚合复用的体现,当我们发现类又多层据称是,就可以考虑使用桥接模式,用聚合代替继承。
? 桥接模式(Bridge):将抽象部分与他的实现部分分离,使他们都可以独立的变化。UML结构图如下:
- Abstraction: 未抽象化的角色,定义出该角色的行为,同时保存一个对实现化角色的引用;
- Implementor:是实现化角色,他是接口或者抽象类,定义角色必须的行为和属性,
- RefinedAbstraction:为修正抽象化角色,引用实现化角色对抽象化角色进行修正,
- ConcreteImplementor:为具体实现化角色,实现接口或者抽象类定义的方法或者属性,
说简单点就是在Abstraction 和 Implementor之间架了一座桥梁(聚合线),这里体现了一个原则,就是合成,服用原则,具体看下面代码示例。
二、桥接模式的应用
- 何时使用
- 系统可能有多个角度分类,每一种角度都有可能变化时
- 方法
- 把这种角度变化分离出来,让他们单独变化,减少他们之间的耦合
- 优点
- 抽象和实现分离,桥梁模式完全是为了解决继承的缺点而提出的设计模式
- 优秀的拓展能力
- 实现细节对客户头透明。客户不用担心细节的实现,它已经由抽象层通过聚合关系完成了封装
- 缺点:
- 会增加系统的理解与设计难度。由于聚合关系简历在抽象层,要求开发者针对抽象进行设计与编程
- 使用场景
- 不希望或者不适用使用继承的场景
- 接口或者抽象类不稳定的场景
- 重用性要求比较高的场景
- 应用实例
- 开关。我们可以看到开关是抽象的,不管里面集体怎么实现
- 手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个聚合线
- 注意事项
- 不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散
- 当发现类的继承有N层时,可以考虑该模式
三、桥接模式的实现
? 我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo,我们的演示类使用 Shape 类来画出不同颜色的圆。
-
创建桥接实现实现接口。
public interface DrawAPI { public void drawCircle(int radius, int x, int y); }
-
创建实现了DrawAPI 接口的实体桥接实现类,
public class RedCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Drawing Circle[ color: red, radius: " + radius +", x: " +x+", "+ y +"]"); } }
public class GreenCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Drawing Circle[ color: green, radius: " + radius +", x: " +x+", "+ y +"]"); } }
-
使用 DrawAPI 接口创建抽象类 Shape。
public abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI){ this.drawAPI = drawAPI; } public abstract void draw(); }
-
创建实现了Shape 接口的实体类。
public class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } public void draw() { drawAPI.drawCircle(radius,x,y); } }
-
使用 Shape 和 DrawAPI 类画出不同颜色的圆。
public class BridgePatternDemo { public static void main(String[] args) { Shape redCircle = new Circle(100,100, 10, new RedCircle()); Shape greenCircle = new Circle(100,100, 10, new GreenCircle()); redCircle.draw(); greenCircle.draw(); } }
-
执行程序,输出结果
Drawing Circle[ color: red, radius: 10, x: 100, 100] Drawing Circle[ color: green, radius: 10, x: 100, 100]
以上是关于结构型模式-桥接模式的主要内容,如果未能解决你的问题,请参考以下文章