一、引言
时间过得真快呀,马上又该睡觉了 ~
二、 什么是桥接模式 ?
桥接模式是将抽象部分与它实现的部分分离,使它们都可以独立地变化。它是一种对象结构性模式,又称为 "接口模式"。
三、传统方式
传统方式的解决办法:
1.先定义电脑的属性、功能抽象出来
2.由不同的款式来实现或者来继承电脑的抽象类
3.最后由不同的品牌来制造出来
出现的问题:
问题一:扩展性问题,如果电脑再出来一个款式,那每个品牌都会增加一个类 (类的数量太多) 。
问题二:违反了单一指责原则,当我们增加电脑品牌时,所有款式的电脑都要增加,这样增加了代码的维护成本。
四、桥接模式
桥接模式关系图
图解: 可以看出,我们把桥接模式分成了两大类,一个是款式,一个是品牌。品牌是电脑具体实现,而款式是抽象,两者进行了分离。
代码实现:
步骤一:定义一个品牌接口,定义方法,具体品牌来实现
/**
* @Author WangYan
* @Date 2022/8/27 19:52
* @Version 1.0
* 品牌
*/
public interface Brand {
void info();
}
/**
* @Author WangYan
* @Date 2022/8/27 20:22
* @Version 1.0
* 苹果品牌
*/
public class Apple implements Brand {
@Override
public void info() {
System.out.print("苹果品牌");
}
}
/**
* @Author WangYan
* @Date 2022/8/27 20:22
* @Version 1.0
* 联想品牌
*/
public class Lenove implements Brand {
@Override
public void info() {
System.out.print("联想品牌");
}
}
步骤二:定义电脑款式的抽象类,通过聚合的方式把具体实现和抽象结合在一起,充当桥接的作用
/**
* @Author WangYan
* @Date 2022/8/27 20:23
* @Version 1.0
* 电脑款式抽象类
*/
public abstract class Computer {
// 聚合品牌接口
protected Brand brand;
// 通过构造函数传入品牌类型
public Computer(Brand brand) {
this.brand = brand;
}
/**
* 调用品牌信息方法
*/
public void info(){
brand.info();
}
}
步骤三 : 定义电脑款式并且继承电脑款式抽象类,通过构造方法来接受具体的品牌
/**
* @Author WangYan
* @Date 2022/8/27 20:26
* @Version 1.0
* 笔记本款式
*/
public class Notebook extends Computer {
public Notebook(Brand brand) {
super(brand);
}
@Override
public void info(){
brand.info();
System.out.println("笔记本");
}
}
/**
* @Author WangYan
* @Date 2022/8/27 20:28
* @Version 1.0
* 台式款式
*/
public class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info(){
brand.info();
System.out.println("台式");
}
}
步骤四:Test测试,通过传入品牌,来创建一个具体款式的电脑
/**
* @Author WangYan
* @Date 2022/8/27 20:29
* @Version 1.0
* Test 测试类
*/
public class Test {
public static void main(String[] args) {
// 苹果台式
Computer computer = new Desktop(new Apple());
computer.info();
// 联想笔记本
Computer computer1 = new Notebook(new Lenove());
computer1.info();
}
}
扩展新的电脑款式或品牌
扩展一:扩展一个电脑的款式,只需要增加一个类就可以通用所有的品牌
/**
* @Author WangYan
* @Date 2022/8/27 22:01
* @Version 1.0
* 平板款式
*/
public class Ipad extends Computer {
public Ipad(Brand brand) {
super(brand);
}
@Override
public void info(){
brand.info();
System.out.println("平板");
}
}
/**
* @Author WangYan
* @Date 2022/8/27 20:29
* @Version 1.0
* Test 测试类
*/
public class Test {
public static void main(String[] args) {
// 平板款式
Computer computer = new Ipad(new Apple());
computer.info();
}
}
扩展二:扩展一个品牌,只需要增加一个类就可以通用所有的电脑款式
/**
* @Author WangYan
* @Date 2022/8/27 22:05
* @Version 1.0
* 小米品牌
*/
public class XiaoMi implements Brand {
@Override
public void info() {
System.out.print("小米品牌");
}
}
/**
* @Author WangYan
* @Date 2022/8/27 20:29
* @Version 1.0
* Test 测试类
*/
public class Test {
public static void main(String[] args) {
// 平板款式
Computer computer = new Notebook(new XiaoMi());
computer.info();
}
}
五、优缺点
优点:
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统。符合开闭原则,就像一座桥,可以把两个变化维度连接起来!
- 桥接模式比多继承方案更好的解决方法,极大的减少了子类的个数,从而减低管理和维护的成本
缺点:
- 接模式的引入会增加系统的理解与设计难度,要求开发者针对抽象进行设计和编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此使用范围具有一定的局限性。
总结:
1.桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
2.使用桥接模式需要注意应用场景,别为了设计模式而去使用设计模式,而是根据实际情况而定。
拜拜~
有任何问题欢迎大家指出~
Thank You !