DesignPattern - 桥接模式【结构型】
# 一、桥接模式介绍
桥接模式是一种结构型模式,将抽象部分与实现部分分离,使它们都可以独立的变化,通俗来说,是通过组合来桥接其它的行为/维度。
- 应用场景
- 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
- 不想使用因继承导致系统类的个数急剧增加的系统
- 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦
- 优点
- 抽象和实现的分离
- 优秀的扩展能力,符合开闭原则
- 缺点
- 增加系统的理解与设计难度
- 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类手机,里面聚合了颜色类
补充:桥接模式用于设计的前期,精细化的设计,让系统更加灵活
# 二、桥接模式代码实现
# 1、举例说明
在编码之前,先举个例子,手机有很规格,比如品牌、内存、机身颜色等等,那么在设计数据库表的时候,绝对不可能在 phone 表中用字段直接描述以上规格,就比如机身颜色来说,除了有常见的红绿蓝等颜色,还有类似 “亮黑”、“晴雪”、“墨羽” 等自定义的颜色,并且后期还可能重命名,可想而知,在 Phone 表中用一个字段来描述颜色维护性是有多差,更别说内存了(内存还分品牌、容量、带宽...),这时把就得考虑把颜色单独放一张 Color 表,两表之间通过 外键关联,以后不管是增加或重命名颜色,都很灵活。
表与表之间通过 外键关联(一般是 Int 类型) 就是一种桥接模式,那么在实际编码中,一般是通过 组合 的方式实现这种桥接关系,即在 Phone 类中持有 Color 对象。另外,因为对象除了可以描述属性,还可以有行为方法,所以说,桥接模式可以桥接其它的行为/维度。
# 2、代码实现
创建 颜色接口,以及 具体颜色类:
/**
* 颜色接口
*
* @author GitLqr
*/
public interface IColor {
String getColor();
}
public class BlueColor implements IColor {
@Override
public String getColor() {
return "蓝色";
}
}
public class RedColor implements IColor {
@Override
public String getColor() {
return "红色";
}
}
创建抽象角色手机类,持有 Color 对象:
/**
* 抽象角色:手机
*
* @author GitLqr
*/
public abstract class Phone {
/**
* 通过组合的方式来桥接其他行为
*/
protected IColor color;
public void setColor(IColor color) {
this.color = color;
}
/**
* 手机的方法
*/
public abstract void run();
}
创建具体角色手机类:
/**
* 手机实例:小米手机
*
* @author GitLqr
*/
public class MiPhone extends Phone {
public MiPhone(IColor color) {
this.setColor(color);
}
@Override
public void run() {
System.out.println(color.getColor() + "小米手机运行中...");
}
}
/**
* 手机实例:苹果手机
*
* @author GitLqr
*/
public class IPhone extends Phone {
public IPhone(IColor color) {
this.setColor(color);
}
@Override
public void run() {
System.out.println(color.getColor() + "苹果手机运行中...");
}
}
使用:
public static void main(String[] args) {
Phone miPhone = new MiPhone(new BlueColor());
miPhone.run(); // 蓝色小米手机运行中...
Phone iPhone = new IPhone(new RedColor());
iPhone.run(); // 红色苹果手机运行中...
}
- 01
- Flutter - 危!3.24版本苹果审核被拒!11-13
- 02
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 03
- Flutter - 轻松实现PageView卡片偏移效果09-08