设计模式之 —— 桥接模式
概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.
应用场景:实现系统可能有多个角度分类,每一种角度都可能变化.
解释:桥接模式将继承模式转化成关联关系,他降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量.
优点:
分离抽象接口及其实现部分.提高了比继承更好的解决方案.
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统.
实现细节对客户不透明,可以隐藏实现细节.
缺点:桥接模式的引入会增加系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行编程.
结构
桥梁模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接 口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层 的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
例子1:
一个表就一个表带?
还是,一个表+多个可更换的表带?
例子2:代码分析
这里写图片描述
package bridge;
/**
* 电脑品牌
*/
public interface Brand {
void sale();
}
// 创建电脑牌子
class Lenovo implements Brand {
@Override
public void sale() {
System.out.println("出售联想");
}
}
class Dell implements Brand {
@Override
public void sale() {
System.out.println("出售戴尔");
}
}
// 新增牌子是十分方便的
class Shenzhou implements Brand {
@Override
public void sale() {
System.out.println("出售神州");
}
}
package bridge;
// 电脑类型+ 获得 品牌的引用
public class Computer {
protected Brand brand;
public Computer(Brand b) {
this.brand = b;
}
public void sale(){
brand.sale();
}
}
// 创建电脑类型
class Desktop extends Computer {
public Desktop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("出售台式电脑");
}
}
class Laptop extends Computer {
public Laptop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("出售笔记本");
}
}
public class Client {
public static void main(String[] args) {
// 这样就笔记轻松的获得牌子 + 类型
Computer c = new Laptop(new Lenovo());
c.sale();
Computer c2 = new Desktop(new Shenzhou());
c2.sale();
}
}
桥接模式和适配器模式的区别:
共同点:桥接和适配器都是让两个东西配合工作
不同点:出发点不同。
适配器:改变已有的两个接口,让他们相容,让他们同时工作。
桥接模式:分离抽象化和实现,目的是分离。桥好了之后,两边的东西还可以变化。
桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。