简介
将抽象部分与它的实现部分分离,使它们可以独立变化。
UML图:
应用场景:
- 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性
- 不想使用继承导致系统类的个数急剧增加
- 某个类存在多个变化维度使用继承方式容易出现类的膨胀
示例
手机厂商和软件厂商
- 实现类:软件
public interface Software {/*** 运行*/void run();
}
1.1 具体实现类:
public class MusicSoftware implements Software{@Overridepublic void run() {System.out.println("运行 音乐软件");}
}
public class GameSoftware implements Software {@Overridepublic 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);}@Overridepublic void use() {System.out.println("安卓手机....");software.run();}
}
public class IOSIphone extends Phone {public IOSIphone(Software software) {super(software);}@Overridepublic 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协同工作的场合