设计模式,个人觉得狠抽象,搜索相关的桥接模式的讲解几乎就是千篇一律!
该内容结合多篇文章及个人的理解所写,有错请提出!
传统模式介绍
- 一个产品抽象类中,在传统方式中产品的扩展一般采用继承方式增加新需求
- 缺点
*对象的继承关系,在编译前已板上钉钉定义好,无法在运行时期动态式应变
*强硬的继承关系,父类的变化极大可能会波及至子类
*易造成类爆炸
如下图
传统模式:
当对某类型新增加,由于传统继承方式都会引起大量的类的新生!
桥接模式
- 一种多维式的组合/聚合思想
- 桥接模式中分为3种角色
- 抽象
- 在桥接模式中的抽象角色
- 一般是在整个系统中作为主体所存在,并且是用abstract所修饰的
- 需持有实现角色的引用,通过set或者构造函数达成聚合/组合关系
- 实现
- 在桥接模式中的实现角色
- 其实是一个接口,依赖/附属于抽象角色而存在,和抽象角色处于一个被组合/被聚合的关系
- 桥
- 在桥接模式中的桥角色也即是实现角色和抽象角色中的组合/聚合的关系
- 特点
- 抽象与行为实现分离,保持各个部分的独立性以及各个部分的功能扩展
- 抽象与行为实现分离,保持各个部分的独立性以及各个部分的功能扩展
- 抽象
代码表达
//经典的手机品牌及应用案例
//桥接模式中抽象角色
class abstract class Phone{
protected List<App> app;
public void supportApp(){}
}
//抽象的派生类 即手机对应的平台:Iphone HuaWeiPhone等
class Iphone extends Phone{
//通过聚合关系达成桥关系
public void setApp(List<App> app){ super.app = app; }
public void supportApp(){ 手机支持的应用... }
}
class HuaWeiPhone extends Phone{
//通过组合关系达成桥关系
public HuaWeiPhone(List<App> app){ super.app = app; }
public void supportApp(){ 手机支持的应用... }
}
//桥接模式中实现角色
interface App{
private String appName;
...App的操作抽象方法
}
//实现角色的实现类:Game(游戏)、MP3、MP4等
class MP3 implements App{ ...省略 }
class Game implements App{ ...省略 }
//后续添加的新功能MP4
class MP4 implements App{ ...省略 }
public class Main{
public static mian(String[] args){
//首先一步:手机
Phone phone = new Iphone();
//iphone支持的应用
App mp3 = new MP3();
App game = new Game();
List<App> app = new ArrayList<App>();
app.add(mp3); app.add(game);
//聚合关系,及Iphone支持的应用
phone.setApp(app); //支持的应用有MP3、Game
//由于时代的发展,新出了一款MP4应用,需要应用在各大手机上,作为基础功能
//这时候实现角色这边只需要添加一个实现类,而抽象角色这边的派生类不需要任何的变动,或者只需要少许的变动
app.add(mp4);
phone.setApp(app); //支持的应用有MP3、Game、MP4
}
}