桥接模式:将抽象的部分与它的实现部分分离,使它们可以独立的变化。
我们先看一个例子
操作系统类。定义了一个运行软件的抽象方法
public abstract class OperatingSystem { //运行软件的方法 public abstract void run(); }
定义了windows和linux类,用于区分不同操作系统项下的软件。
public abstract class Windows extends OperatingSystem { } public abstract class Linux extends OperatingSystem { }
下面是windows操作系统下的游戏类和办公软件类。
public class WindowsGame extends Windows { @Override public void run() { System.out.println("Windows下的游戏"); } } public class WindowsOffice extends Windows { @Override public void run() { System.out.println("Windows下的办公软件"); } }
下面是linux操作系统下的游戏类和办公软件类。
public class LinuxGame extends Linux { @Override public void run() { System.out.println("Linux下的游戏"); } } public class LinuxOffice extends Linux { @Override public void run() { System.out.println("Linux下的办公软件"); } }
测试类。
public class Test { public static void main(String[] args) { OperatingSystem operatingSystem; operatingSystem = new LinuxGame(); operatingSystem.run(); operatingSystem = new LinuxOffice(); operatingSystem.run(); operatingSystem = new WindowsGame(); operatingSystem.run(); operatingSystem = new WindowsOffice(); operatingSystem.run(); } }
测试结果:
Linux下的游戏
Linux下的办公软件
Windows下的游戏
Windows下的办公软件
从上面的例子我们可以看到每一个操作系统下都有其对应的办公软件类和游戏类,这样就会出现问题,当我们需要增加软件类型时,可能所有操作系统下都需要添加这个软件,这样就得新建很多类,另一方面,当我们需要增加操作系统时,就得把所有的软件都得再添加一遍,,但是我们考虑到,游戏,办公软件其实都是软件,我们可以把它抽象出来,看下面的例子
抽象操作系统类,定义了一个软件属性。
public abstract class OperatingSystem { protected Soft soft; public void setSoft(Soft soft) { this.soft = soft; } public abstract void run(); }
具体操作系统类。
public class Linux extends OperatingSystem { @Override public void run() { System.out.println("linux下的"+soft.run()); } } public class Windows extends OperatingSystem { @Override public void run() { System.out.println("windows下的"+soft.run()); } }
把不同操作系统下的软件抽象出的软件接口以及实现类。
public interface Soft { String run(); } public class Game implements Soft { @Override public String run() { return "游戏"; } } public class Office implements Soft { @Override public String run() { return "办公软件"; } }
测试类
public class Test { public static void main(String[] args) { OperatingSystem operatingSystem; operatingSystem = new Linux(); operatingSystem.setSoft(new Game()); operatingSystem.run(); operatingSystem.setSoft(new Office()); operatingSystem.run(); operatingSystem = new Windows(); operatingSystem.setSoft(new Game()); operatingSystem.run(); operatingSystem.setSoft(new Office()); operatingSystem.run(); } }
测试结果:
linux下的游戏
linux下的办公软件
windows下的游戏
windows下的办公软件
这样我们就把操作系统的抽象部分(软件)从操作系统类中抽象出来,当我们需要增加操作系统,就需要添加操作系统的具体类,添加软件时,就只需要实现软件接口即可。