什么是桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式, 通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合, 从而能在开发时分别使用。 举个例子,例如某个手机厂商生产三个品牌的手机:小米、华为、苹果,每个品牌又分为64G、128G、256G,那么,将会有13个类:
随着品牌的增加和存储的增加,类会越来越多,最终“嘣”炸了,也就是常说的“类爆炸”,为了解决“类爆炸”问题,出现了桥接模式:
桥接模式的结构
桥接模式中有四个角色:
- 抽象化角色(Abstraction) 主要用来定义角色的行为,同时保存一个对实现化角色的引用,一般为抽象类。
- 修正抽象化角色(RefinedAbstraction) 引用实现化角色对抽象化角色进行修正。
- 实现化角色(Implementor) 定义角色必须的行为和属性。
- 具体实现化角色(ConcreteImplementor) 实现接口或抽象类定义的方法和属性。
一句话表示为:抽象角色引用实现角色,抽象角色的部分实现是由实现角色完成的。
桥接模式的实现
/**
* 桥接模式
* 概述:抽象角色引用实现角色,抽象角色的部分实现是由实现角色完成的。
* 总结:不要过度使用集成,优先进行聚合,降低耦合度。
*/
public class Bridge {
public static void main(String[] args) {
Phone phone = new HuaWeiPhone(new Memory64());
phone.info();
phone = new XiaoMiPhone(new Memory128());
phone.info();
phone = new ApplePhone(new Memory256());
phone.info();
}
}
abstract class Phone {
Memory memory;
public Phone(Memory memory) {
this.memory = memory;
}
abstract void info();
}
interface Memory {
String getMemeory();
}
class XiaoMiPhone extends Phone {
public XiaoMiPhone(Memory memory) {
super(memory);
}
@Override
void info() {
System.out.println("当前手机品牌为小米,内存" + this.memory.getMemeory());
}
}
class HuaWeiPhone extends Phone{
public HuaWeiPhone(Memory memory) {
super(memory);
}
@Override
void info() {
System.out.println("当前手机品牌为华为,内存" + this.memory.getMemeory());
}
}
class ApplePhone extends Phone{
public ApplePhone(Memory memory) {
super(memory);
}
@Override
void info() {
System.out.println("当前手机品牌为苹果,内存" + this.memory.getMemeory());
}
}
class Memory64 implements Memory {
@Override
public String getMemeory() {
return "64G";
}
}
class Memory128 implements Memory {
@Override
public String getMemeory() {
return "128G";
}
}
class Memory256 implements Memory {
@Override
public String getMemeory() {
return "256G";
}
}
通过实现可以看出来,类的数量明显少了,好处在于增加品牌只需要Phone派生子类,增加内存只需要Memory派生子类,可以随意组合,即不同品牌的手机可以和不同的内存进行组合。
桥接模式的优缺点
桥接模式的优点
- 符合单一职责原则、开闭原则。
- 抽象和实现分离,抽象和实现单独控制,互不影响。
- 提高系统的可拓展性。
桥接模式的缺点
1.增加了系统的设计和理解难度。
桥接模式的使用场景
- 多维度扩展类时可以使用桥接模式。
- 不希望使用继承导致类爆炸可以使用桥接模式。
总结
桥接模式用聚合的方式代替继承,降低抽象与具体的耦合,重点在于“解耦”,一句话总结:双重维度扩展。 桥接模式和组合模式的区别:组合模式侧重于整体与部分,桥接模式侧重于同级别类。