桥接设计模式
今天我们来学习一个新的设计模式,桥接设计模式。它关注的点是将实现和抽象分层独立,互相不影响,可以独立进行扩展
我们先来看一下传统的干活方式,不使用桥接,让抽象层和实现层建立关系。
这里选用了小米手机的型号,可以看到无论是使用继承环视聚合的方式,抽象层和实现层之间均不相互独立,当有一者发生改变的时候,与之相关联的就会发生改变。也正是因为这个原因出现了桥接设计模式。
我们来具体看一下桥接设计模式的特点。
- 实现类
- 抽象类
- 桥
我们来看一下桥接设计模式的UML图
它的主要特点就是在实现层和抽象层之间切入了一层,把这一层当作了桥,使用到具体的实现类,将之传入即可,两者互相分离,独立。扩展方便。
基于上述的原理图,我们来改良一下开篇的小米手机型号的问题。
我们引入了一个Model
作为实现层和抽象层之间沟通的桥梁,通过构造参数将对应的实现类传入,实现具体的操作。
我们来看一下具体的代码实现。
- 行为实现
interface Mi {
void play();
}
class Note extends Model{
public Note(Mi mi) {
super(mi);
}
@Override
void play() {
super.mi.play();
System.out.println("这是Note系列手机");
}
}
class Redme extends Model{
public Redme(Mi mi) {
super(mi);
}
@Override
void play() {
super.mi.play();
System.out.println("这是RedMe系列手机");
}
}
class Mix extends Model{
public Mix(Mi mi) {
super(mi);
}
@Override
void play() {
super.mi.play();
System.out.println("这是Mix系列手机");
}
}
- 桥
abstract class Model{
protected Mi mi ;
public Model(Mi mi){
this.mi = mi ;
}
abstract void play() ;
}
- 具体实现类
class Note4 implements Mi{
@Override
public void play() {
System.out.println("这是Note4");
}
}
class RedmePro20 implements Mi{
@Override
public void play() {
System.out.println("这是RedmePro20");
}
}
class Mix3 implements Mi{
@Override
public void play() {
System.out.println("这是Mix3");
}
}
最后,桥接设计模式结束了。这是第6个设计模式,不过看到这里,兄弟们应该可以感觉的出来,设计模式是将一个问题复杂化,将系统解耦,让系统的扩展性变得更加的优雅。通过引入一个中间层,通过聚合的方式等等实现程序解耦。这个时候我们也会想到一个很重要的问题,时间换空间,空间换时间,也是类似,牺牲一方成就一方。