一个抽象会有多个实现,我们会用继承来协调他们。继承机制将抽象部分与具体实现固定在一起,使得抽象部分和实现部分难以独立地进行修改。
比如我们的系统需要做一个窗口,那么要实现这个窗口的绘制,可能这个版本的窗口需要绘制边框,另一个版本不需要,但是这边框和线条分为window下的和mac下的,
那么这个边框和线条我们需要独立出来,采用桥接的方式去实现,而这个独立出来的接口就是桥。
窗口类
窗口类中维护了一个DrawToolImpl类接口的对象,这个对象正是所谓的桥。
public abstract class Window { protected DrawToolImpl drawTool; public Window(DrawToolImpl drawTool){ this.drawTool = drawTool; } public abstract void drawWindow(); }
这个桥是我们定义的接口,具体靠子类来实现
public interface DrawToolImpl { void drawLine(); void drawBorder(); }
第一个版本的窗口我们画了边框和线
public class OneWindow extends Window{ public OneWindow(DrawToolImpl drawTool) { super(drawTool); } public void drawWindow() { this.drawTool.drawBorder(); this.drawTool.drawLine(); } }
//第二个版本只画了边框
public class TwoWindow extends Window{ public TwoWindow(DrawToolImpl drawTool) { super(drawTool); } public void drawWindow() { this.drawTool.drawBorder(); } }而画笔工具分为windows下的和mac下的
public class WinDrawToolImpl implements DrawToolImpl{ public void drawLine() { System.out.println("windows下的线"); } public void drawBorder() { System.out.println("windows下的边框"); } }public class MacDrawToolImpl implements DrawToolImpl{ public void drawLine() { System.out.println("mac下的线"); } public void drawBorder() { System.out.println("mac下的边框"); } }这样的桥接方式,我们在画窗口时不需要去管具体是哪个系统下的画笔工具。
实现结果
public class Cilent { public static void main(String[] args){ Window window = new OneWindow(new WinDrawToolImpl()); window.drawWindow(); } }windows下的边框
windows下的线