设计模式—桥接模式
桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
层次结构中的第一层(通常称为抽象部分)将包含对第二层(实现部分的引用)。抽象部分能将一些对自己的的调用委派给实现部分对象,所有的实现部分都有一个通用接口,因此他们能在抽象部分内部相互替换
桥接模式在处理跨平台应用、 支持多种类型的数据库服务器或与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时会特别有用。
1.为什么会有桥接模式
问题:
假如我有一个电脑类型类,从他扩展出两个子类:Notebook(笔记本)和Desktop(台式机)。我现在希望对这些类层次结构进行扩展其品牌,我打算创建名为Apple(苹果)和HUAWEI(华为)。但是我已经有了两个子类,所以总共需要创建四个类才能覆盖所有组合。例如:苹果笔记本,苹果台式机,华为笔记本,华为台式机。
这样的话在层次结构中新增一个品牌就会导致代码复杂程度指数增长。例如添加一个Lenovo(联想)的品牌,我就需要增加笔记本和台式机两个子类,这样情况会越来越糟糕。
解决方案:
问题的根本原因试图在两个独立的维度品牌和类型上拓展品牌类。桥接模式通过将继承改为组合的方式来解决这个问题。具体讲就是抽取其中一个维度使之成为一个独立的类层次,这样就可以在初始类引用这个新层次的对象,从而使得一个类不必具备所有的状态和行为。
2.代码实现
-
电脑品牌接口
public interface Brand { //品牌名称 void info(); }
-
电脑品牌实现类
public class Apple implements Brand { @Override public void info() { System.out.print("Apple"); } }
public class HuaWei implements Brand{ @Override public void info() { System.out.print("HuaWei"); } }
-
抽象的电脑类型
public abstract class Computer {
//组合
protected Brand brand;
public Computer(Brand brand){
this.brand=brand;
}
public void info(){
//自带品牌
brand.info();
}
}
//台式机
class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.println("台式机");
}
}
//笔记本
class Notebook extends Computer{
public Notebook(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.println("笔记本");
}
}
-
测试
public static void main(String[] args) { //HuaWei台式机 Computer computer=new Desktop(new HuaWei()); computer.info(); //Apple笔记本 Computer computer1=new Notebook(new Apple()); computer1.info(); }
现在我想增加一个品牌只需要写一个继承Brand接口的类就可以实现拥有这个品牌的笔记本和台式机