什么是桥接模式
桥接模式是指将抽象和实现分离开来,使得它们可以保持独立存在。这个模式基于类的最小设计原则(最少的修改代码),多用于替代多层继承方案,以减少类的个数,防止类爆炸。
对照——传统的多层继承方案
想要学习一个设计模式,首要的就是了解这个设计模式解决什么。
我们假设一个案例:
要开发一套手机图片浏览App,他可以在ios,Android上使用,可以查看JPG,PNG格式的文件。
如果采用传统的多层继承方案的类图将是这样的
我们可以看到,如果我们再增加一个新的系统类型,还需要增加3个类(包括一个新系统类和两个图片格式类);如果我们再增加一个新的图片格式,也需要在各个系统下各增加一个类。那么这就会引发类的扩展性问题,也就是类爆炸。甚至当我们增加新的功能的时候需要修改所有的类,代码的维护成本变得很高。
对照——桥接模式
我们再看一下使用桥接模式的案例类图:
可以看出来这个类图很像一个桥,通过桥把左边的抽象类和右边的实现接口聚合到了一起,其实就是调用与被调用的关系。并且通过分析我们可以发现不管是新增加新的系统还是增加新的图片格式我们都仅仅需要增加一个类就可以完成。
这个类图有这几部分构成:
- 抽象类App:它的主要作用是维护接口和接口的实现类Jpg和Png,以聚合的方式充当桥接类。
- AndroidApp和iOSApp类:它们是抽象类App的子类。
- Format接口:它是实现类的接口。
- Jpg和Png类:它们是具体是实现类。
桥接模式的案例代码
实现类接口Format
package bridge;
//实现类的接口,定义see()的方法
public interface Format {
void see();
}
实现类Jpg
package bridge;
//具体实现类Jpg
public class Jpg implements Format {
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("正在浏览jpg图片");
}
}
实现类Png
package bridge;
//具体实现类Png
public class Png implements Format{
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("正在浏览png图片");
}
}
抽象类App
package bridge;
//抽象的桥接类app
public abstract class App {
//聚合格式
private Format format;
//构造器
public App(Format format) {
super();
this.format = format;
}
//调用接口的方法
protected void see() {
format.see();
}
}
AndroidApp类
package bridge;
//AndroidApp类继承app类并重写其方法
public class AndroidApp extends App{
//构造器
public AndroidApp(Format format) {
super(format);
}
@Override
public void see() {
super.see();
System.out.print("Android系统app");
}
}
IOSApp类
package bridge;
//IOSApp继承app类并重写其方法
public class IOSApp extends App{
//构造器
public IOSApp(Format format) {
super(format);
}
@Override
public void see() {
super.see();
System.out.print("iOS系统app");
}
}
客户端 Client
package bridge;
//客户端 Client
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//获取系统+格式
App app1=new AndroidApp(new Jpg());
app1.see();
App app2=new AndroidApp(new Png());
app2.see();
System.out.println("*************");
App app3=new IOSApp(new Jpg());
app3.see();
App app4=new IOSApp(new Png());
app4.see();
}
}
运行截图
详细类图
总结
- 桥接模式通过抽象和实现的分离,增大了系统的灵活性。
- 系统的高层部分只需要知道抽象部分和实现部分的接口,不需要管理具体的实现业务。
- 桥接模式可以替代多层继承方案,更方便系统进行分层设计,从而产生更好的结构化系统。
- 桥接模式的应用场景需要有两个独立的维度,尤为适用不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。
转载:https://blog.csdn.net/qq_44025396/article/details/105393642
查看评论