基本介绍
- 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
- 是一种结构型设计模式
- Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
简单来说:它是将对象进行进一步的分解,以实现解耦的目的。
举个栗子来说:手机有内存属性和品牌属性,我们将这个类中的两个独立变化的维度分离开来,使两者可以独立扩展,让系统更加符合“单一职责原则”。
- 画UML类图展示如下:
也就是我们买手机的时候有两个维度可以供我们选择:一个是品牌,一个是内存。
代码实现
角色展示:
- client:指的是我们买手机的人
- Abstraction(抽象类):指的是手机抽象类
- Refined Abstraction(具体类):指的是具体手机品牌
- Implementor:在这里相当于手机的其它组件,内存
- ConcreteImplementor:具体的内存型号
代码展示:
- 定义Implementor,这里定义手机内存接口
public interface Memory{
public void showMemory();
}
- 定义ConcreteImplementor,这里指具体的内存
内存这里定义的两种,一种是4G,一种是8G。
// 4G的内存
public class Memory4G implements Memory{
@Override
public void showMemory(){
System.out.println("手机安装了4G的内存");
}
}
//8G的内存
public class Memory8G implements Memory{
@Override
public void showMemory(){
System.out.println("手机安装了8G的内存");
}
}
- 定义Abstraction手机抽象类
public abstract class Phone{
public Memory phoneMemory;
public void setMemory(Memory memory){
this.phoneMemory=memory;
}
public abstract void buyPhone();
}
- 定义Refined Abstraction(具体的手机品牌)
- 定义华为手机
public class Huawei extends Phone{
@Override
public void buyPhone(){
//PhoneMemory是继承父类的一个属性,可以直接使用
phoneMemory.showMemory();
System.out.println("华为手机,111");
}
}
- 定义小米手机
public class Xiaomi extends Phone{
@Override
public void buyPhone(){
//PhoneMemory是继承父类的一个属性,可以直接使用
phoneMemory.showMemory();
System.out.println("x小米手机,222");
}
}
- 测试
public class Client{
//让华为手机搭配8G内存
Phone huawei=new Huawei();
huawei.setMemory(new Memory8G());
huawei.buyPhone();
//让小米搭配4G的内存
Phone xiaomi=new Mi();
mi.setMemory(new Memory4G());
mi.buyPhone();
}
桥接模式总结
1. 为什么使用桥接模式不使用继承呢?
继承是一种强耦合关系,子类与父类有非常紧密的依赖关系,父类的任何变化 都会导致子类发生变化。因此才使用桥接模式,使用了桥接模式之后,我们的两个维度就像桥梁一样被链接了起来。体现了松耦合的特性。
2、桥接模式的优点
(1)分离抽象和实现部分:把手机、内存抽象出来。实现与之分离。
(2)松耦合:两个维度分开
(3)单一职责原则:每个维度各干各的活
文章来自:https://baijiahao.baidu.com/s?id=1639383166201396225&wfr=spider&for=pc