今天我们来学习一种结构型模式,桥接模式(Bridge Pattern)。
模式定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
模式结构
桥接模式包含如下角色:
Abstraction: 抽象类
RefinedAbstraction: 扩充抽象类
Implementor: 实现类接口
ConcreteImplementor:具体实现类
UML图
代码实现
电视和遥控器是一个完美展示两层抽象的例子。你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。
AbstractRemoteControl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| /** * 抽象类 */ public abstract class AbstractRemoteControl {
private ITV mITV;
public AbstractRemoteControl(ITV ITV) { mITV = ITV; }
public void turnOn() { mITV.on(); }
public void turnOff() { mITV.off(); }
public void setChannel(int channel) { mITV.switchChannel(channel); } }
|
LogitechRemoteControl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /** * 扩充类抽象接口 */ public class LogitechRemoteControl extends AbstractRemoteControl { public LogitechRemoteControl(ITV ITV) { super(ITV); }
public void setChannelKeyboard(int channel) { System.out.println("LogitechRemoteControl doing something"); setChannel(channel); } }
|
ITV.java
1 2 3 4 5 6 7 8 9 10 11
| /** * 实现类接口 */ public interface ITV {
void on();
void off();
void switchChannel(int channel); }
|
LeTV.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /** * 具体实现类 */ public class LeTV implements ITV {
@Override public void on() { System.out.println("Letv turn on"); }
@Override public void off() { System.out.println("LeTV turn off"); }
@Override public void switchChannel(int channel) { System.out.println("LeTV channel: " + channel); } }
|
XiaoMiTV.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /** * 具体实现类 */ public class XiaoMiTV implements ITV {
@Override public void on() { System.out.println("XiaoMiTV turn on"); }
@Override public void off() { System.out.println("XiaoMiTV turn off"); }
@Override public void switchChannel(int channel) { System.out.println("XiaoMiTV channel: " + channel); } }
|
测试类
1 2 3 4 5 6 7 8 9 10 11
| public class MyClass {
public static void main(String[] args) { ITV itv = new LeTV(); LogitechRemoteControl logitechRemoteControl = new LogitechRemoteControl(itv); logitechRemoteControl.turnOn(); logitechRemoteControl.setChannelKeyboard(30); logitechRemoteControl.turnOff(); } }
|
运行结果
模式分析
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
桥接模式的优点
桥接模式的缺点
代码已经放到GitHub上了https://github.com/HJXANDHMR/DesignPattern。
参考
http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/bridge.html
欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧