GOF对桥接模式的定义是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。下面是基本代码的实现
/**
*
* @author ricardo
* @Time 下午4:31:53
* @Function:抽象的Implementor
*
*/
public abstract class Implementor {
public abstract void Operation();
}
public class Abstraction {
protected Implementor implementter;
public void setImplementter(Implementor implementter) {
this.implementter = implementter;
}
public void Operation() {
implementter.Operation();
}
}
public class RefinedAbstraction extends Abstraction {
@Override
public void Operation() {
implementter.Operation();
}
}
具体派生类
public class ConcreteImplementA extends Implementor{
@Override
public void Operation() {
System.out.println("the concrete operation of classA ");
}
}
public class ConcreteImplementB extends Implementor{
@Override
public void Operation() {
System.out.println("the concrete operation of classB ");
}
}
客户端代码
public class Client {
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction();
abstraction.setImplementter(new ConcreteImplementA());
abstraction.Operation();
abstraction.setImplementter(new ConcreteImplementB());
abstraction.Operation();
}
}
运行截图
以上是桥接模式的基本实现,我们举个现实的例子,学生选课的实现
计算机系和数学系的学生都要选数学课,但是很明显大家学习的内容是不一样的,如何控制这一点而且保证系统的性能稳定呢?
/**
*
* @author ricardo
* @Time 下午5:03:17
* Function:数学类别
*
*/
public abstract class Math {
public abstract void Select();
}
/**
*
* @author ricardo
* @Time 下午5:04:17
* Function:数学分析课
*
*/
public class MathAnalysis extends Math{
@Override
public void Select() {
System.out.println("数学分析课");
}
}
public class AdvanceMath extends Math{
@Override
public void Select() {
System.out.println("高等数学");
}
}
//院系的抽象类代码
public abstract class Departments {
protected Math mathCourse;//院系包含的数学课,有需要可以进一步扩展,包括英语等其他内容
public void SetCource(Math math) {
mathCourse=math;
}
public abstract void Select();
}
//计算机系
public class Computer extends Departments {
@Override
public void Select() {
System.out.println("计算机系的同学们开始选课");
mathCourse.Select();
}
}
//数学系
public class Mathematics extends Departments{
@Override
public void Select() {
System.out.println("数学系的同学们开始选课");
mathCourse.Select();
}
}
客户端代码
public class Client {
public static void main(String[] args) {
Departments dp;
dp = new Computer();
dp.SetCource(new AdvanceMath());
dp.Select();
dp = new Mathematics();
dp.SetCource(new MathAnalysis());
dp.Select();
}
}
运行截图
可以看到,可以在却很了院系+课程的情况下,完成学生选课的需求。
所谓抽象与实现的分离,其实实现指的就是抽象类和它的派生类用于实现自己的对象,也就是说课程既可以按照课程类别来分,也可以按照系所来区分。桥接恶魔是适用于这种有多重分类,并且每种分类经常要独立变化的情况,当代码采用如上实现的时候,无论是 新增加一们课程,还是增加一个需要选课的系所,只需要增加一个子类就OK了,这样不仅降低了工作量,而且也更符合“开放-封闭”原则。
桥接模式从效果上来说,解除了不同分类实现之间的耦合性,使其可以独立变化。将一个抽象操作的集合转移到一个接口中,就可以创建一个所谓的桥,这样的好处就是我们要实现的抽象取决于这个接口的实现,而桥接模式的目的正是将一个抽象和其他抽象操作的实现进行了分离。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载