这是我参与更文挑战的第24天,活动详情查看:更文挑战
桥接模式
所有模式都有别名,桥接模式也是如此。桥接模式也可以叫做桥梁模式。顾名思义桥接模式就是作为枢纽,承担连接两端的作用。
桥接模式定义:将抽象部分与实现部分分离,让两者可以独立进行变化。
桥接模式角色:
- Abstraction: 抽象部分
- RefinedAbstraction 优化抽象部分
- Implementor 实现部分
- ConcreteImplementor1、ConcreteImplementor2 实现部分具体实现
实战
Computer表示Abstraction抽象部分;Desktop和Laptop表示RefinedAbstraction;Brand表示Implementor实现部分;Lenovo和Dell是ConcreteImplementor1、ConcreteImplementor2具体实现。“抽象”与“实现”实质上对应的是两个独立变化唯独,任何多维度变化或者多个树状类的耦合都可以使用桥接模式实现解耦。Computer是抽象类,但不代表所谓的“抽象部分”,Brand也不是“实现部分”,两者都是各自维度独立变化的。桥接模式将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。电脑品牌算是一个维度,电脑类型也是一个维度,将两者关系区分开来;Dell品牌电脑可以是笔记本Laptop也可以是台式Desktop,这种组合形式可以在抽象层面上去实现。
若是多层继承结构那耦合性将变得复杂的多,比如Computer是基类,电脑类型子类划分为Desktop、Laptop,然后在电脑类型上继续划分子类Dell Desktop电脑、Dell Laptop电脑、Lenovo Desktop电脑、Lenovo Laptop电脑等则会使得整个结构设计上存在大量耦合,增加一种电脑类型是否就需要对每个品牌的电脑都要进行扩展实现?但实际开发过程中并不一定说所有品牌都具有某种类型的电脑。一方面对于类的扩展是膨胀性的,另一方面违反了单一职责原则。
public interface Brand {
void sale();
}
class Lenovo implements Brand {
@Override
public void sale() {}
}
class Dell implements Brand {
@Override
public void sale() {}
}
public abstract class Computer {
protected Brand brand;
public Computer(Brand b) {
this.brand = b;
}
public abstract void sale();
}
class Desktop extends Computer {
public Desktop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
}
}
class Laptop extends Computer {
public Laptop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
}
}
Computer computer1 = new Laptop(new Lenovo());
computer1.sale(); // Lenovo品牌笔记本
Computer computer2 = new Desktop(new Dell());
computer2.sale();// Dell品牌台式机
Computer computer3 = new Desktop(new Lenovo());
computer3.sale(); // Lenovo品牌台式机
复制代码
总结
桥接模式优点在于分离抽象与实现,灵活扩展。桥接模式取代多层继承的设计模式,符合单一职责原则设计思想,减少子类扩展数量。桥接模式缺点缺是不好实现,对于设计上有较高要求。
参考
- 《Android源码设计模式》