Java设计模式(十九)—— 桥接模式

        桥接模式定义如下:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

适合桥接模式的情景如下:

  • 不希望抽象和某些重要的实现代码是绑定关系,可运行时动态决定
  • 抽象和实现者都可以继承的方式独立的扩充,程序在运行时可能需要动态地将一个抽象子类的实例与一个实现者的子类实例进行组合
  • 希望对实现者层次代码的修改对抽象层不产生影响

有一类事物结合,设为A1、A2、...、Am,每个事物都有功能F1、F2、...、Fn。

如邮局业务:

信件(事物)可以平邮和挂号,包裹(事物)也可以平邮和挂号。 

普通思路:

class A1 {
    void F1(){}  //平邮
    void F2(){}  //挂号
}

class A2 {
    void F1(){}  //平邮
    void F2(){}  //挂号
}

 桥接模式:

(1)定义邮寄接口IPost

public interface IPost {  //邮局
    public void post(); //发送功能
}

(2)两个具体的邮寄类SimplePost、MarkPost

平邮

public class SimplePost implements IPost{
    @Override
    public void post() {
        System.out.println("这是一封简单邮件");
    }
}

挂号

public class MarkPost implements IPost{
    @Override
    public void post() {
        System.out.println("这是一封挂号邮件");
    }
}

(3)抽象事物类 AbstractThing

public class AbstractThing {
    private IPost obj;

    public AbstractThing(IPost obj) {
        this.obj = obj;
    }
    public void post() {
        obj.post();
    }
}

该类是桥接模式的核心。“信件和包裹共享平邮和挂号的功能”:信件、包裹是两个不同的事物,它们有共享的功能,也一定有不同的功能。共享的功能一定能封装到一个类中,又由于该类不能代表一个具体的事物,因此把它定义成abstract类是恰当的。

(4)具体事物类 信件类和包裹类

public class Letter extends AbstractThing{
    
    public Letter(IPost obj) {
        super(obj);
    }
    //其他独有变量和方法
}
public class Parcel extends AbstractThing{

    public Parcel(IPost obj) {
        super(obj);
    }
    //其他独有变量和方法
}

(5)测试类

public class Test {
    public static void main(String[] args) {
        IPost p = new SimplePost();
        Letter letter = new Letter(p);
        letter.post(); //这里其实就是调用了 p.post()
    }
}

总结:

该例子通过AbstractThing 类中的成员变量obj,它就像桥梁一样,使得事物类与功能类巧妙的联系起来。

现在考虑如果新增加了事物,只需要从Abstract派生一个类即可,其他无需改变。

public class NewThing extends AbstractThing{
    public NewThing(IPost obj) {
        super(obj);
    }
    //其他独有变量和方法
}

如果新增加了新的邮寄事物,比如特快专递,只需从IPost接口派生一个类即可,其他无需改变。

public class UrgencyPost implements IPost{
    @Override
    public void post() {
        System.out.println("这是特快");
    }
}

你可能感兴趣的:(设计模式,设计模式,桥接模式)