爱情是需要付出和舍得的,当你想要得到一份刻骨铭心的爱情时,你就必须作好承受刻骨铭心之苦的准备,否则,就不要轻易去尝试。
设计模式学习,近期我会把23中设计模式都写成博客,敬请期待~
– 2021/1/9
桥接模式,又叫桥梁模式,将抽象部分与它实现部分分离,使它们都可以独立地变化。
百度百科
当我们发现类有多层继承时就可以考虑使用桥接模式,用聚合代替继承。
来看看这张图:
网络图(1.1)
:
分析:
假设我们要去买电脑,电脑又分为:
台式电脑又可以细分为联想台式,苹果台式等等,笔记本和平板也是一样
如果正常思维写代码是不是要把电脑类当做顶级的Base
然后台式电脑,笔记本电脑,平板电脑分别继承自电脑类
最后联想台式,苹果台式,戴尔台式又分别继承自台式电脑…
那么如果这么写的话有什么问题?
他是不是会出现多继承的关系,就是一层继承一层,代码就会出现高度耦合性,导致代码不利于维护,而且你改一个地方,另一个地方很有可能冲突,
比如说我想改台式电脑的显示器,我改了一处地方,继承他的子类就有可能有冲突问题.(这里的子类指联想台式,苹果台式,戴尔台式)
就拿联想台式来说:
品牌和产品混合到个类中违反了单一职责原则
网络图(1.2)
:
如果这么写代码的话是不是就会好很多呢?
把苹果,联想,戴尔,归到品牌
平板,笔记本,台式机归到类型
如果我要苹果台式机是不是红框的位置(查看网络图(1.2)
)
如果我要联想笔记本是不是蓝框的位置(查看网络图(1.2)
)
如果我要苹果平板是不是黑框的位置(查看网络图(1.2)
)
再以苹果台式机来举例:
网络图(1.3)
:
台式机属于类型,苹果属于品牌,连接他们的点就是桥
现在大家心里是不是应该有解决的思路了呢?
吧品牌和类型单独做成一个抽象类
然后苹果,联想,戴尔实现品牌类
平板笔记本台式实现类型
然后通过组合的方式把他们组合到一起,这样就实现了’桥’
IBrand品牌类:
public abstract class ABrand {
public abstract void info();
}
AType类型类:
public abstract class AType {
public abstract void type();
}
接下来分别实现:
Dell(戴尔)是一个品牌,实现品牌:
public class Dell extends ABrand {
@Override
public void info() {
Log.i("桥接模式","戴尔");
}
}
Lenovo(联想)是一个品牌,实现品牌:
public class Lenovo extends ABrand {
@Override
public void info() {
Log.i("桥接模式","联想");
}
}
Computer(电脑)是类型,实现AType,把品牌(ABrand)组合进来:
public class Computer extends AType {
private ABrand brand;//相当于桥 品牌
public Computer(ABrand brand) {
this.brand = brand;
}
@Override
public void type() {
brand.info();
Log.i("桥接模式:","电脑");
}
}
Computer(笔记本)是类型,实现AType,把品牌(ABrand)组合进来:
public class Notebook extends AType {
private ABrand brand;
public Notebook(ABrand brand) {
this.brand = brand;
}
@Override
public void type() {
brand.info();
Log.i("桥接模式:","笔记本");
}
}
使用代码(示例一):
//电脑 品牌
Computer computer = new Computer(new Lenovo());
computer.type();
电脑里面传入联想品牌,得到联想电脑
Log图(2.1)
:
使用代码(示例二):
//电脑 品牌
Computer computer = new Computer(new Lenovo());
computer.type();
Notebook notebook = new Notebook(new Dell());
notebook.type();
new 笔记本,传入Dell品牌,得到戴尔笔记本!
Log图(2.1)
:
好处:
缺点:
完整代码
设计模式/设计原则目录
原创不易,您的点赞就是对我最大的支持,留下您的点赞吧~