阅读 42

DesignPattern - 桥接模式【结构型】

欢迎关注微信公众号:FSA全栈行动 👋

一、桥接模式介绍

桥接模式是一种结构型模式,将抽象部分与实现部分分离,使它们都可以独立的变化,通俗来说,是通过组合来桥接其它的行为/维度。

  • 应用场景
    • 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
    • 不想使用因继承导致系统类的个数急剧增加的系统
    • 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦
  • 优点
    • 抽象和实现的分离
    • 优秀的扩展能力,符合开闭原则
  • 缺点
    • 增加系统的理解与设计难度
    • 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类手机,里面聚合了颜色类

补充:桥接模式用于设计的前期,精细化的设计,让系统更加灵活

二、桥接模式代码实现

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(); // 红色苹果手机运行中...
}
复制代码

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

文章分类
代码人生
文章标签