桥接模式
Bridge
定义: 桥接模式将抽象层与实现层分离,使得抽象层和实现层可以独立变化
引入桥接模式
项目要求: 对不同手机品牌的不同功能进行编程
方案一 继承
当要添加其他品牌手机或添加其他功能,会变得非常复杂
手机品牌与手机功能存在强耦合
桥接模式简介
定义: 桥接模式是一种结构型模式,使用合成复用原则将实现层和抽象层分离解耦,使得实现层与抽象层可以独立改变
比如: 蜡笔与毛笔,它们都有颜色和型号,实现3种型号和3种颜色,蜡笔需要9支(3x3),毛笔只需要3支(要什么颜色就用毛笔去蘸什么颜色的墨水),蜡笔就是颜色和型号强耦合
角色
- 实现部分
Implementor
实现化角色 接口ConcreteImplementor
具体实现化角色 接口的实现类
- 抽象部分
Abstraction
抽象化角色 抽象类 (被客户端调用)RefinedAbstraction
修正抽象化角色 继承抽象类
大话设计模式结构图
使用桥接模式代替继承方案
可以将手机品牌看成抽象部分,手机功能看成实现部分
使用合成复用原则(尽量使用聚合而不用继承)进行松耦合
增加新手机品牌就去继承抽象化角色,增加新功能就去实现实现化角色 实现松耦合
实现部分指的是 抽象化实现类用来实现自己的对象 (打电话/玩游戏 是 华为/一加手机用来实现自己的对象)
使用桥接模式的代码
结构图
Implementor
/**
* @author Tc.l
* @Date 2021/1/28
* @Description:手机功能
*/
public interface Implementor {
//作用
void effect();
}
ConcreteImplementor
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:手机功能实现类A打电话
*/
public class ConcreteImplementorA implements Implementor{
@Override
public void effect() {
System.out.print("打电话");
}
}
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:手机功能实现类B玩游戏
*/
public class ConcreteImplementorB implements Implementor{
@Override
public void effect() {
System.out.print("玩游戏");
}
}
Abstraction
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:手机品牌
*/
public abstract class Abstraction {
private Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public Abstraction() {
}
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public void effect(){
implementor.effect();
}
}
RefinedAbstraction
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:手机品牌抽象化的实现--华为手机
*/
public class RefinedAbstractionA extends Abstraction{
public RefinedAbstractionA(Implementor implementor) {
super(implementor);
}
public RefinedAbstractionA() {
}
@Override
public void effect() {
super.effect();
System.out.println(" (华为手机)");
}
}
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:手机品牌抽象化的实现--一加手机
*/
public class RefinedAbstractionB extends Abstraction{
public RefinedAbstractionB(Implementor implementor) {
super(implementor);
}
public RefinedAbstractionB() {
}
@Override
public void effect() {
super.effect();
System.out.println(" (一加手机)");
}
}
Client
/**
* @author Tc.l
* @Date 2021/1/29
* @Description:
*/
public class Client {
public static void main(String[] args) {
//实现
//打电话
Implementor call = new ConcreteImplementorA();
//玩游戏
Implementor game = new ConcreteImplementorB();
//抽象
//华为手机
Abstraction huaweiPhone = new RefinedAbstractionA(call);
//一加手机
Abstraction yijiaPhone = new RefinedAbstractionB(call);
huaweiPhone.effect();
yijiaPhone.effect();
huaweiPhone.setImplementor(game);
yijiaPhone.setImplementor(game);
huaweiPhone.effect();
yijiaPhone.effect();
}
}
/*
打电话 (华为手机)
打电话 (一加手机)
玩游戏 (华为手机)
玩游戏 (一加手机)
*/
总结
特点
- 桥接模式常用于代替多层继承,减少子类的个数
- 将抽象层与实现层分离, 实现层聚合在抽象层中
使用场景
桥接模式适用于不希望使用多重继承导致拥有大量类的系统 (合成复用原则: 聚合代替继承)