BRIDGE(桥接)—对象结构型模式

桥接模式【bridge】

  • 什么是桥接模式
    将抽象部分于它的实现部分分离,使它们都可以独立地变化,这个摘自<设计模式>的解释,一般很难去理解,稍后我会以代码加文字的形式给大家解释清楚。

  • 什么场景会用到桥接模式
    现在给大家一个场景,比如现在要做这样一个功能,需求上描述,分别开发多个软件应用,同时需要适应不同的系统,再详细一点,比如,现在开发了一款购物app和阅读app,需要兼容安卓和苹果系统,这时候大家需要怎么进行设计。
    大部分新手程序员在接触到这个的时候可能第一时间想到的是继承,通过继承的方式去重写父类的方法,类图如下:
    初始类图

就是父类有抽象方法,具体怎么实现由子类去实现
在这里插入图片描述
就是父类是mobile,然后包含运行game和运行read的方法,由每个子类去实现,这样就有了四种不同的实现,这么设计的缺点在哪里呢,第一就是每个app在安卓和苹果系统里面都需要一个子类,比如增加了一个英语学习app,就要分别去两个系统里面添加对应的子类,第二,如果需求改变,比如,需要增加华为鸿蒙系统的兼容,那么这个改变无疑是巨大的,并且如果系统里面多100个要兼容的app,那么就要去增加100个鸿蒙下面的子类,分别不同的实现。
这个时候桥接模式就可以好好利用起来了, 回顾一下桥接模式的概念。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让他们各自的变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。让我们把设计图修改一下,以达到这个目的
在这里插入图片描述

代码如下:
先定义一个Software接口:
public interface Software {

	void operate();
}

再写它的两个子类

public class Game implements Software   {

	@Override
	public void operate() {
		System.out.println("init game");
	}
	
}
public class Read implements Software {

	@Override
	public void operate() {
		System.out.println("init read");
	}

}

接着开始添加一个抽象类Mobile

public abstract class Mobile {
	
	private Software software;
	
	public Software getSoftware() {
		return software;
	}

	public void setSoftware(Software software) {
		this.software = software;
	}

	public abstract void run();
}

然后是它的两个子类实现

public class IOS extends Mobile {

	@Override
	public void run() {
		System.out.println("IOS init..");
		getSoftware().operate();
	}

}
public class Android extends Mobile {

	@Override
	public void run() {
		System.out.println("Android init..");
		getSoftware().operate();
	}
}

从以上结构不难看出,若以后不管是添加新的操作系统还是添加新的app都不会相互影响,这就是松耦合

public static void main(String[] args) {
		Mobile mobile = new Android();
		mobile.setSoftware(new Game());
		mobile.run();
		mobile.setSoftware(new Read());
		mobile.run();
	}

现在回想起来,桥接模式这个概念是不是逐渐清晰了,说的通俗易懂一点就是,在我们现实场景中,系统可能按多种维度进行分类,每一种分类都可能发生变化,那么就把这种多角度分类分离出来让他们不相互依赖,减少它们之间的耦合。重点是理解如何将抽象化与现实化的脱耦的

相关参考:
<大话设计模式>,<设计模式,可复用面向对象软件的基础>
源码在此

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章