桥接模式
如若要实现下图关系我们首先可以使用多继承的方式
未使用桥接模式
很麻烦(部分实现代码如下)
package pattern.bridge;
//电脑
public interface Computer {
void sale();
}
package pattern.bridge;
public class Desktop implements Computer {
@Override
public void sale() {
System.out.println("销售台式机!");
}
}
package pattern.bridge;
public class Laptop implements Computer {
@Override
public void sale() {
System.out.println("销售笔记本!");
}
}
package pattern.bridge;
public class Pad implements Computer{
@Override
public void sale() {
System.out.println("销售平板电脑!");
}
}
package pattern.bridge;
public class LenovoDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售联想台式机");
}
}
package pattern.bridge;
public class LenovoLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售联想笔记本");
}
}
package pattern.bridge;
public class LenovoPad extends Pad {
@Override
public void sale() {
System.out.println("销售联想平板电脑");
}
}
存在很多问题
- 扩展性问题(类个数膨胀问题):
- 如果要增加一个新的电脑类型:智能手机,则要增加各个品牌下的类。
- 如果要增加一个新的品牌,也要增加各种电脑类型的类。
- 违反单一指责原则:
- 一个类:联想笔记本,有两个引起这个类变化的原因。
使用桥接模式
核心要点:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展正在抽象层建立关系。
建立品牌
package pattern.bridge;
/**
* 品牌
*/
public interface Brand {
void sale();
}
package pattern.bridge;
public class Dell implements Brand {
@Override
public void sale() {
System.out.println("销售戴尔电脑!");
}
}
package pattern.bridge;
public class Lenvovo implements Brand {
@Override
public void sale() {
System.out.println("销售联想电脑!");
}
}
建立电脑类型
package pattern.bridge;
/**
* 电脑类型
*/
public class Computer {
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void sale(){
brand.sale();
}
}
package pattern.bridge;
public class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}
package pattern.bridge;
public class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
}
测试调用
package pattern.bridge;
public class Client {
public static void main(String[] args) {
//销售联想笔记本
Computer computer=new Laptop(new Lenvovo());
computer.sale();
}
}
结果
销售联想电脑!
销售台式机
如果想增加新的类型或品牌可以直接新加一个类继承相对应的接口,非常的方便。