多层继承
因为类的继承关系,我们在构建时,可以使用图中的方式。但是有个问题就是,当我们向图中新增加一个品牌的时候,我们要同时添加三个类。即台式机下添加xx台式机,笔记本下添加xx笔记本,平板下添加xx平板。这样维护起来比较麻烦。其主要原因是每个具体的类承担了两个角色,比如联想台式机不仅承担联想这个品牌,而且承担台式机角色。
解决方案
从上面的问题中我们可以观察到其实类功能有两个维度,一个是品牌维度,一个是类型维度
我们通过桥接的方式将这个两个维度连接起来,这样的话就可以得到不同的类。而且如果需要添加一个新的类型(如手机)或新的品牌,只需要在自己的维度上添加即可。这样就避免了上面的问题因添加一个新的类型或功能而需要添加多个类的问题了。
类图关系
在类图关系中,可以看出桥接模式其实是通过组合的方式来实现的。Computer类持有了Brand的引用,然后在自己的内部来调用Brand的方法。
举例
Computer类
package com.dy.xidian; public abstract 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("销售台式机"); } }
Brand接口
package com.dy.xidian; 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("销售戴尔电脑"); } }
Client类
package com.dy.xidian; public class Clinet { public static void main(String[] args) { Computer c = new Laptop(new Lenovo()); c.sale(); } }