桥接模式
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接模式优缺点
桥接模式优点
-
分离抽象与实现 : 桥接模式使用组合关系解耦了抽象和实现之间的继承关系
-
提高扩展型 : 二者可以继续进行扩展不需要改变系统原有的功能
桥接模式缺点 :
-
系统复杂 : 增加了系统的理解与设计难度
-
识别变化维度 : 需要正确地识别出系统中两个独立变化的维度
桥接模式结构
桥接模式UML
-
抽象化角色 Abstraction: 定义抽象的接口,包含一个对实现化角色的引用,依赖于完成底层实际工作的实现对象。
-
扩展抽象化角色 RefinedAbstraction: 抽象化角色的子类,一般对抽象部分的方法进行完善和扩展,实现父类中的业务方法,并通过组合/聚合关系调用实现化角色中的业务方法。
-
实现化角色 Implementor: 定义具体行为、具体特征的应用接口,供扩展抽象化角色使用,一般情况下是由实现化角色提供基本的操作,而抽象化角色定义基于实现部分基本操作的业务方法。
-
具体实现化角色 ConcreteImplementor: 完善实现化角色中定义的具体逻辑。
实现流程
定义品牌类(实现化角色)
//品牌
public interface Brand {
void info();
}
定义苹果品牌(具体实现化角色A)
//苹果品牌
public class Apple implements Brand{
@Override
public void info() {
System.out.println("苹果");
}
}
定义联想品牌(具体实现化角色B)
//联想品牌
public class Lenovo implements Brand{
@Override
public void info() {
System.out.println("联想");
}
}
定义抽象化角色电脑类
//抽象电脑类
public abstract class Computer {
//组合品牌
protected Brand brand;
public Computer(Brand brand)
{
this.brand = brand;
}
public void info(){
brand.info();
}
}
定义台式电脑(扩展抽象化角色A)
//台式
public class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info(){
super.info();
System.out.println("台式机");
}
}
定义笔记本电脑(扩展抽象化角色)
//笔记本
public class Laptop extends Computer{
public Laptop(Brand brand) {
super(brand);
}
@Override
public void info(){
super.info();
System.out.println("笔记本");
}
}
测试类
public class Test {
public static void main(String[] args) {
//苹果笔记本
Computer computer = new Laptop(new Apple());
computer.info();
//联想台式机
Computer computer2 = new Desktop(new Lenovo());
computer2.info();
}
//main 方法执行结果----------------------------------
//苹果
//笔记本
//联想
//台式机
}
适配器模式与桥接模式之间的区别
-
共同点:桥接和适配器都是让两个东西配合工作
-
不同点:出发点不同。
-
适配器:改变已有的两个接口,让他们相容。
-
桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离。
-