设计模式23——桥梁模式

桥梁模式的定义 

Decouple an abstraction from its implementation so that the two can vary independenty.(将抽象的实现解耦,使得两者可以独立的变化)

桥梁模式的应用 

  1. 桥梁模式的优点 

    重点内容抽象和实现分离
    这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。
    优秀的扩充能力
    看看我们的例子,想增加实现?没问题!想增加抽象,也没有问题!只要对外暴露的接口层允许这样的变化,我们已经把变化的可能性减到最小。
    实现细节对客户透明
    客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

  2. 桥梁模式的缺点

     必须知道选择哪一种类型的实现。

  3. 桥梁模式的使用场景。

    1.不希望或不适用使用继承的场景。例如继承层次过度,无法更细化设计颗粒等场景

    2.接口或抽象类不稳定的场景。明知道接口不稳定还想通过实现或继承来实现业务需要,那是得不偿失的,也是比较失败的做法

    3.重用性要求比较高的场景。设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度

桥梁模式的实现

/**
 * 抽象化角色
 */
public abstract class Abstraction {


    //定义对实现化角色的引用
    private Implementor imp;

    //约束子类必须实现该构造函数
    public Abstraction(Implementor _imp) {
        this.imp = _imp;
    }

    //自身的行为和属性
    public void request() {
        this.imp.doSomething();
    }

    //获得实现化角色
    public Implementor getImp() {
        return imp;
    }
}



/**
 * 实现化角色
 */
public interface Implementor {


    //基本方法
    public void doSomething();

    public void doAnything();

}

/**
 * 具体实现化角色
 */
public class ConcreteImplementor2 implements Implementor {

    public void doSomething() {
        System.out.println("业务逻辑处理 ConcreteImplementor2 doSomething");
    }

    public void doAnything() {
        System.out.println("业务逻辑处理 ConcreteImplementor2 doAnything");
    }
}



/**
 * 具体实现化角色
 */
public class ConcreteImplementor1 implements Implementor {
    public void doSomething() {
        System.out.println("业务逻辑处理 ConcreteImplementor1 doSomething");
    }

    public void doAnything() {

        System.out.println("业务逻辑层处理 ConcreteImplementor1 doAnything");

    }
}


public class RefindAbstraction extends Abstraction {

    public RefindAbstraction(Implementor _imp) {
        super(_imp);
    }

    //修正父类的行为
    public void request() {
        /**
         * 业务处理
         */
        super.request();

        super.getImp().doAnything();
    }
}


/**
 * 场景类
 */
public class Main {


    public static void main(String[] args) {
        //定义一个实现化角色
        Implementor imp = new ConcreteImplementor1();

        //定义一个抽象化角色
        Abstraction abs = new RefindAbstraction(imp);

        //执行行文
        abs.request();
    }
}

桥梁模式在源码中的应用

Framework 内部的源码实现中,比较典型的桥接模式应用是 Window 与 WindowManager 之间的关系。在 fwk 中 Window 和 PhoneWindow 构成窗口的抽象部分,其中 Window 类为该抽象部分的抽象接口,PhoneWindow 为抽象部分具体的实现及扩展。而 WindowManager 则为实现部分的基类,WindowManagerImpl 为实现部分具体的逻辑实现,其使用 WindowManagerGlobal 通过 IWindowManager 接口与 WindowManagerService (也就是 WMS)进行交互,并由 WMS 完成具体的窗口管理工作
 

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值