简介
将抽象部分与它的实现部分分离,使它们可以独立变化。
UML图:
应用场景:
- 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性
- 不想使用继承导致系统类的个数急剧增加
- 某个类存在多个变化维度使用继承方式容易出现类的膨胀
示例
手机厂商和软件厂商
- 实现类:软件
public interface Software {
/**
* 运行
*/
void run();
}
1.1 具体实现类:
public class MusicSoftware implements Software{
@Override
public void run() {
System.out.println("运行 音乐软件");
}
}
public class GameSoftware implements Software {
@Override
public void run() {
System.out.println("运行 游戏软件");
}
}
- 抽象类:手机
public abstract class Phone {
protected Software software;
public Phone(Software software) {
this.software = software;
}
/**
* 使用
*/
public abstract void use();
}
2.1 实现类:
public class AndroidPhone extends Phone {
public AndroidPhone(Software software) {
super(software);
}
@Override
public void use() {
System.out.println("安卓手机....");
software.run();
}
}
public class IOSIphone extends Phone {
public IOSIphone(Software software) {
super(software);
}
@Override
public void use(){
System.out.println("苹果手机....");
software.run();
}
}
- 运行
public class Main {
public static void main(String[] args) {
Software musicSoftware = new MusicSoftware();
Software gameSoftware = new GameSoftware();
new AndroidPhone(musicSoftware).use();
new IOSIphone(musicSoftware).use();
new AndroidPhone(gameSoftware).use();
new IOSIphone(gameSoftware).use();
}
}
总结
- 优点
- 实现抽象和实现的分离,提高系统灵活性
- 具备良好的扩展性,符合开闭原则
- 缺点
- 增加系统的理解和设计难度
VS 适配器模式
- 适用阶段不同
- 桥接模式用于设计的前期,精细化的设计,让系统更加灵活
- 适配器模式用于设计完成之后,发现类、接口之间无法一同工作,需要进行填坑
- 应用场景
- 适配器模式经常用于在第三方API协同工作的场合