桥接模式:
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用桥接模式。
优点:
桥接模式将继承关系转化为关联关系,降低了类于类之间的耦合度,降低了类的数量。
组成:
- 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
类图:
例子:
手机有不同的品牌,上面有很多软件,用程序实现,用不同的手机运行各种软件,怎么实现?像这种两个维度的就可以用桥接模式来解决。
代码:
public abstract class Phone { public Software software; abstract void run(); public void setSoftware(Software software) { this.software = software; } }
public class PhoneA extends Phone { @Override void run() { System.out.print("用A手机"); software.start(); } }
public class PhoneB extends Phone { @Override void run() { System.out.print("用B手机"); software.start(); } }
public interface Software { void start(); }
public class CameraSoftware implements Software { @Override public void start() { System.out.println("打开相机"); } }
public class GameSoftware implements Software { @Override public void start() { System.out.println("打开游戏"); } }
public class Client { public static void main(String[] args) { Software game = new GameSoftware(); Software camera = new CameraSoftware(); Phone phone1 = new PhoneB(); phone1.setSoftware(game); phone1.run(); Phone phone2 = new PhoneA(); phone2.setSoftware(camera); phone2.run(); } }