桥接模式理解起来也是非常简单,我们仍然从生活中的问题出发,如果一些事物的分类可以从两个或者多个维度来划分,就比如不同品牌和不同排量的汽车,他们可以有 M x N 种结果(例如:奥迪A8 2.0排量,奥迪A6 2.0排量,奔驰S350L 3.0排量,等等)
这种情况下如果选择继承的方式,就会出现一种多层继承的关系,子类就会非常多,同时扩展也很麻烦
像这样的例子还有很多,比如品牌和产品类型之间,或者不同颜色和字体的图形或者文字,等等
还是老规矩,直接用实际的代码例子引入
背景:相机品牌(索尼,佳能等)和相机类型(单反,微单,卡片机等)两种维族的组合结果
我们想要做的就是取消他们的继承关系,而使用组合
/**
* 相机品牌类
*/
public interface CameraBrand {
void showInfo();
}
/**
* 索尼品牌
*/
public class Sony implements CameraBrand {
@Override
public void showInfo() {
System.out.print("【索尼】");
}
}
/**
* 佳能品牌
*/
public class Canon implements CameraBrand {
@Override
public void showInfo() {
System.out.print("【佳能】");
}
}
/**
* 抽象相机类
*/
public abstract class Camera {
// 将品牌组合进来
protected CameraBrand cameraBrand;
public Camera(CameraBrand cameraBrand) {
this.cameraBrand = cameraBrand;
}
public void showInfo(){
cameraBrand.showInfo();
}
}
/**
* 单反相机
*/
public class SlrCameras extends Camera {
public SlrCameras(CameraBrand cameraBrand) {
super(cameraBrand);
}
@Override
public void showInfo() {
super.showInfo();
System.out.println("单反相机");
}
}
/**
* 卡片相机(数字相机)
*/
public class DigitalCamera extends Camera {
public DigitalCamera(CameraBrand cameraBrand) {
super(cameraBrand);
}
@Override
public void showInfo() {
super.showInfo();
System.out.println("卡片相机(数字相机)");
}
}
测试一下
public class Test {
public static void main(String[] args) {
// 索尼单反相机
Camera camera = new SlrCameras(new Sony());
camera.showInfo();
// 佳能卡片相机
Camera camera2 = new DigitalCamera(new Canon());
camera2.showInfo();
}
}
运行结果:
【索尼】单反相机 【佳能】卡片相机(数字相机)
从上述代码中可以看出,我们现在已经可以对不同类型和不同产品的相机进行任意的组合了,例如索尼单反相机,或者佳能单反相机都是可以的,如果想要增加一个品牌或者产品只需要增加具体的实现类就可以了
定义:将抽象与实现分离,使它们可以独立变化
实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离
简单说明一下其中的角色
优点:
经常遇到一些可以通过两个或多个维度划分的事物,第一种解决方式就是多层继承,但是复用性比较差,同时类的个数也会很多,桥接模式是改进其的更好办法
桥接模式增强了系统的扩展性,在两个维度中扩展任意一个维度都不需要修改原有代码,符合开闭原则
缺点:
桥接模式增加了系统的理解与设计难度:因为聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度
邮箱:ideal_bwh@163.com
如果帮到你的话,那就来关注我吧!
如果您更喜欢微信文章的阅读方式,可以关注我的公众号
如果您更加喜欢PC端的阅读方式,可以访问我的个人博客
域名:www.ideal-20.cn
在这里的我们素不相识,却都在为了自己的梦而努力 ❤ 一个坚持推送原创开发技术文章的公众号:理想二旬不止