桥接模式—将抽象部分与它的实现部分分离,使他们可以独立的变化。
这样大家可能不太清楚 这下我们举一个例子来表示一下,在我们的wps文档中,由于在不同的操作系统中,我们需要做的操作时不同的,因为操作系统定义的底层接口不同,所以会有不同的操作,接下来使用我们的桥接模式。下面附上一张图:
我们的window对象下有许多的子类,他们是不同的窗口类型,比如图标,对话框等。
接下来我们给出一个简单的实现:
1.先写出Window窗口类和它的实现子类: (记得看一下我的注释)
//窗口类的父类
public interface Window {
//画一个矩形操作 此处我们应该注意该方法在子类实现中不一定是直接委托给具体实现类来操作
//可能会做一些公共的预处理操作 比如说我们可能会在画矩形的时候对它的长宽高做一些定制化处理
//它与WindowImpl实现的是不同维度的功能 比如我们WindowImpl是根据不同操作系统做操作
//那么我们window的预处理就是与操作系统无关的一些操作
public void DrawRect(WindowImp windowImp);
}
-------------------------------------------------------------------------------------
public class DialogWindow implements Window{
@Override
public void DrawRect(WindowImp windowImp) {
System.out.println("进行Dialog的一些预处理操作");
windowImp.DeviceRect();//委托给具体的窗口实现
}
}
-------------------------------------------------------------------------------------
public class IconWindow implements Window{
@Override
public void DrawRect(WindowImp windowImp) {
System.out.println("进行Icon的一些预处理操作");
windowImp.DeviceRect();//委托给具体的窗口实现
}
}
-------------------------------------------------------------------------------------
//application的窗口实现类
public class ApplicationWindow implements Window{
@Override
public void DrawRect(WindowImp windowImp) {
System.out.println("进行Application的一些预处理操作");
windowImp.DeviceRect();//委托给具体的实现类来操作
}
}
2.实现具体的操作系统对应的操作WindowIml:
//不同操作系统实现类的父类
public interface WindowImp {
public void DeviceRect();
}
-------------------------------------------------------------------------------------
//Mac操作系统的实现类
public class MacWindowImpl implements WindowImp{
@Override
public void DeviceRect() {
System.out.println("Mac操作系统画矩形");
}
}
-------------------------------------------------------------------------------------
//PM操作系统的实现类
public class PMWindowImp implements WindowImp{
@Override
public void DeviceRect() {
System.out.println("PM操作系统画矩形");
}
}
-------------------------------------------------------------------------------------
//XM操作系统做的实现类
public class XWindowImp implements WindowImp{
@Override
public void DeviceRect() {
System.out.println("X操作系统画矩形");
}
}
3.下面就是我们的系统调用 (Mian方法):
public class Main {
public static void main(String[] args){
//创建Window对象
ApplicationWindow applicationWindow=new ApplicationWindow();
IconWindow iconWindow=new IconWindow();
DialogWindow dialogWindow=new DialogWindow();
//假如都是Mac操作系统
applicationWindow.DrawRect(new MacWindowImpl());
iconWindow.DrawRect(new MacWindowImpl());
dialogWindow.DrawRect(new MacWindowImpl());
}
}
4.实验截图:
**我们可以看到桥接模式帮我们实现了上述操作,同时它将我们的具体的操作延迟到子类来实现,避免了窗口与操作系统的直接依赖,减小了耦合性,而且还可以非常方便的支持我们新的操作系统,只需实现WindowImp方法即可。**避免了内爆炸,如果我们用多继承的方法,那么我们将会对每一个Window的实现对象的每一个操作都写一个具体的方法,比如我们从Window,的画矩形操作需要实现多个方法,在不同操作系统的画矩形,桥接模式成功的把我们的方法个数从n*n降低到n+n,极大的避免了类爆炸。