概念
桥接模式就是将抽象部分与它的实现部分分离开来,使他们都可以独立变化。何为抽象?比如我觉得你很热心,热心这个词就属于一个抽象的概念,是我们脑子里觉得的一种形式,那么具体实现是什么,你扶老奶奶过马路,这是一个具体行为,我们看得见的。
实现
案例:今天我和女朋友去看电影,要去看什么电影呢?平时996的我哪有时间去了解现在有什么电影上映,等我们到了电影院,它们播什么我们就看什么呗。
首先定义一个电影的抽象类:
public abstract class Film {
//定义一个方法,给子类实现
protected abstract void show();
}
现在电影院热播钢铁侠和美女与野兽,接下来实现这两个类:
public class IronMan extends Film {
@Override
protected void show() {
System.out.println("现在观看的是钢铁侠。");
}
}
public class BeautyAndBeast extends Film{
@Override
protected void show() {
System.out.println("现在播放的是美女与野兽。");
}
}
最后就是我们去看电影的场景:
public class Client {
public static void main(String[] args) {
System.out.println("我们去看电影.");
//有一天,我们去看钢铁侠
IronMan ironMan = new IronMan();
ironMan.show();
//有一天,我们去看美女与野兽
BeautyAndBeast beautyAndBeast = new BeautyAndBeast();
beautyAndBeast.show();
}
}
终于有一天,我的女朋友生气了,她说:“我们去电影院看电影,你也不问问我,我想看什么类型的电影。”女朋友这么生气,我觉得我不改不行啊,我得赶紧了解现在的电影都是什么类型的。
那我得给这些电影都添加一个电影类型,java类是单继承的,我如果在钢铁侠和美女与野兽的类中进行继承爱情电影,科幻电影,那么也是不可行的呀!将这些电影类型的类转换为接口?我这个案例比较简单,实际情况中可能这些类型的类还有实现方法,所以这就得用到我们的桥接模式。
类图如下:
定义一个电影的抽象类:
public abstract class Film {
//定义一个方法,给子类实现
protected abstract void show();
}
定义电影抽象部分的具体实现:
public class Romantic extends Film {
@Override
protected void show() {
System.out.println("这个属于爱情电影。");
}
}
public class ScienceFiction extends Film {
@Override
protected void show() {
System.out.println("这是科幻电影。");
}
}
定义一个电影的实现部分的抽象概念:
public abstract class FilmImpl {
//定义一个电影对象,抽象概念的
private Film film;
//构造函数,由子类定义传递具体的电影
public FilmImpl(Film film){
this.film = film;
}
//定义一个播放的抽象方法
public void show(){
this.film.show();
}
}
定义电影实现部分的具体实现
public class IronMan extends FilmImpl {
//定义构造方法,把电影传进来
public IronMan(Film film) {
super(film);
}
public void show() {
super.show();
System.out.println("现在观看的是钢铁侠。");
}
}
public class BeautyAndBeast extends FilmImpl {
//定义构造方法,把电影传进来
public BeautyAndBeast(Film film) {
super(film);
}
public void show() {
super.show();
System.out.println("现在播放的是美女与野兽。");
}
}
最后就是我们去看电影的情节了:
public class Client {
public static void main(String[] args) {
System.out.println("我们去看电影.");
//有一天,我们去看科幻片——钢铁侠
IronMan ironMan = new IronMan(new ScienceFiction());
ironMan.show();
System.out.println("女友开心起来了!");
System.out.println("_______________________________________________________");
//有一天,我们去看爱情片——美女与野兽
BeautyAndBeast beautyAndBeast = new BeautyAndBeast(new Romantic());
beautyAndBeast.show();
System.out.println("女友开心起来了!");
}
}
实验结果:
优点:将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
参考文章:https://www.runoob.com/design-pattern/bridge-pattern.html
本文的代码:https://pan.baidu.com/s/1SzWRXI4O3y-M3FGzRx9ofg
提取码:cp1c