桥接模式

前言

适配器模式能够在不改变目标代码的状况下,经过引入适配类来给目标类扩展功能。桥接模式也是一种结构型模式。微信

如下没有更形象生动的介绍,结合平时所写代码进行理解为佳markdown

目录

1、定义

将抽象和实现解耦,使得二者能够独立变化。这里的抽象和实现能够理解为抽象实体和抽象出行为函数

2、模式原理分析

打个比方,你有一家房地产公司,后面增长了新业务,成立了新的公司,专门快速山寨其它行业爆品性能

//抽象公司 公司共有属性
public abstract class Corp{
	//生产
    protected abstract void produce();
    //卖产品
    protected abstract void sell();
    //公司开始运营挣钱
    public void run(){
        this.produce();
        this.sell();
    }
}

//你的房地产公司
public class HouseCorp extends Corp(){
    protected void produce(){
        System.out.println("工人替老板盖房子并给工人发工资");
    }
    protected void sell(){
        System.out.println("工人拿到工资后,再借钱向老板买房子");
    }
}
//新开的山寨服装公司
public class ClothesCorp extends Corp{
    protected void produce(){
        System.out.println("回收旧衣服,加以利用");
    }
    protected void sell(){
        System.out.println("旧衣服到底卖不卖");
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        HouseCorp houseCrop = new HouseCorp();
        houseCorp.run();
        ClothesCorp clothesCorp = new ClothesCorp();
        clothesCorp.run();
    }
}
复制代码

若是山寨衣服的公司不想生产衣服了,怎么办?删除这个类,而后新建一个具备新产品的类吗?这样的代码改动,也就是新建一个类继承Corp,你能够接受吗?前期是能够的,后期若是变化快,那岂不是场景类中须要大量修改代码。咱们能够转变思惟,抽象出产品类,每次你只要指定生产哪一个产品就能够了,只要符合规范。this

现利用桥接模式改成spa

//抽象产品类
public abstract class Product{
    public abstract void beProducted();
    public abstract void beSelled();
}
//房子  产品
public class House extends Product{
    public void beProducted(){
        System.out.println("生产房子");
    }
    public void beSelled(){
        System.out.println("卖房子");
    }
}

//山寨衣服  产品
public class Clothes extends Product{
    public void beProducted(){
        System.out.println("生产衣服");
    }
    public void beSelled(){
        System.out.println("卖衣服");
    }
}

//抽象公司
public abstract class Corp{
    private Product product;
    public Corp(Product product){
        this.product = product;
    }
    public void run(){
    	//生产产品
        this.product.beProducted();
        //卖产品
        this.product.beSelled();
    }
}
//房产公司
public class HouseCorp extends Corp{
    public HouseCorp(House house){
        super(house);
    }
    public void run(){
        super.run();
    }
}
//山寨公司
public class ShanZhaiCorp extend Corp{
    public ShanZhaiCorp(Product product){
        super(product);
    }
    public void run(){
        super.run();
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        House house = new House();
        HouseCorp houseCorp = new HouseCorp(house);
        houseCorp.run();
        ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes());
        shanZhaiCorp.run();
    }
}
复制代码

这里的构造函数,主要是为了提醒子类,你必须作这项工做。之后每次山寨产品,扩展,只须要增长公司,继承Corp类,增长对应产品类。设计

对应于抽象和实现分离,这里Product能够认为是实现化,Corp能够认为是抽象化,Product的子类 与ShanZhaiCorp 已经分离了。山寨公司ShanZhaiCorp实现类,包含了抽象行为类Product以及实现了抽象行为runcode

3、使用场景

  • 不但愿使用继承的场景orm

  • 接口或抽象类不稳定的场景对象

  • 基于消息驱动的场景。 虽然消息的行为比较统一,主要包括发送、接收、处理和回执,但其实具体客户端的实现一般却各不相同,好比,手机短信、邮件消息、QQ 消息、微信消息等。

  • 拆分复杂的类对象时。 当一个类中包含大量对象和方法时,既不方便阅读,也不方便修改。

  • 须要在运行时切换不一样实现方法时。 好比,经过门面模式调用外部 RPC 服务。

  • 重用性要求高的场景。设计的颗粒度越细,重用的可能性就越大,采用继承的方式受父类的限制。

4、优势

  • 抽象和实现分离

    • 解决了继承的缺点,实现能够不受抽象的约束
  • 优秀的扩充能力

    • 增长Product的实现,能够把变化缩减至最小
  • 实现细节对客户透明

    • 不用关心细节如何,只须要完成产品实现

5、缺点

  • 增长了维护成本,用组合和聚合关系不像继承关系那样容易找到对象之间的调用关系,稍不注意就会影响到其余对象

  • 增长了设计难度,桥接模式更重视聚合而非继承关系,须要创建更多的抽象层

  • 性能降低,组合或者聚合关系,简化理解的同时,调用对象变多了

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息