DesignPattern - 桥接模式【结构型】

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

1、桥接模式介绍

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

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

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

2、桥接模式代码实现

一、举例说明

在编码以前,先举个例子,手机有很规格,好比品牌、内存、机身颜色等等,那么在设计数据库表的时候,绝对不可能在 phone 表中用字段直接描述以上规格,就好比机身颜色来讲,除了有常见的红绿蓝等颜色,还有相似 “亮黑”、“晴雪”、“墨羽” 等自定义的颜色,而且后期还可能重命名,可想而知,在 Phone 表中用一个字段来描述颜色维护性是有多差,更别说内存了(内存还分品牌、容量、带宽...),这时把就得考虑把颜色单独放一张 Color 表,两表之间经过 外键关联,之后无论是增长或重命名颜色,都很灵活。微信

表与表之间经过 外键关联(通常是 Int 类型) 就是一种桥接模式,那么在实际编码中,通常是经过 组合 的方式实现这种桥接关系,即在 Phone 类中持有 Color 对象。另外,由于对象除了能够描述属性,还能够有行为方法,因此说,桥接模式能够桥接其它的行为/维度。markdown

二、代码实现

建立 颜色接口,以及 具体颜色类:ide

/** * 颜色接口 * * @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 对象:oop

/** * 抽象角色:手机 * * @author GitLqr */
public abstract class Phone {

	/** * 经过组合的方式来桥接其余行为 */
	protected IColor color;

	public void setColor(IColor color) {
		this.color = color;
	}

	/** * 手机的方法 */
	public abstract void run();
}
复制代码

建立具体角色手机类:this

/** * 手机实例:小米手机 * * @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等文章, 可能有你想要了解的技能知识点哦~spa

相关文章
相关标签/搜索