桥接模式

再战设计模式(八)之桥接模式 随笔 第1张

场景分析:

商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

这个场景中有两个变化的维度:电脑类型电脑品牌。

再战设计模式(八)之桥接模式 随笔 第2张

 

不是使用桥接模式

类图:

 

再战设计模式(八)之桥接模式 随笔 第3张

代码:

再战设计模式(八)之桥接模式 随笔 第4张
package disign.brige;
/**
 * @Created by xiaodao
 */
public interface Computer {

    void sale();
}


class Desktop implements Computer{

    public void sale() {
        System.out.println("销售台式机");
    }
}

class Laptop implements Computer{


    public void sale() {
        System.out.println("销售笔记本");
    }
}


class Pad implements Computer{


    public void sale() {
        System.out.println("销售平板");
    }
}

class LenovoDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("销售联想台式机");
    }
}

class LenovoLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("销售联想笔记本");
    }
}

class LenovoPad extends Pad{
    @Override
    public void sale() {
        System.out.println("销售联想pad");
    }
}

class ShenzhouDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("销售Shenzhou台式机");
    }
}

class ShenzhouLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("销售Shenzhou笔记本");
    }
}

class ShenzhouPad extends Pad{
    @Override
    public void sale() {
        System.out.println("销售Shenzhou  pad");
    }
}
View Code

像原来这样的的层次结构,如果我们要新添加一个品牌的话,我们需要extends3个产品如果产品越来越多,以后的维护越来越困难

 

bridge

类图:

再战设计模式(八)之桥接模式 随笔 第6张

从类图上的对比也能看出我们需要添加一个品牌或者修改的话,比之前的关联少了.

主要的逻辑就是讲具有俩个类型的类分开进行解耦,通过桥接来联系起来 这时候我们如果添加一个品牌就添加一个实现就好了

代码如下:

 

/**
 * @Created by xiaodao
 * 
 */
public interface Brand {


    String sale();
}

/**
 * @Created by xiaodao
 */
public class Lenovo implements Brand {


    public String sale() {
        return  "联想";
    }
}


/**
 * @Created by xiaodao
 */
public class Dell implements Brand {
    public String sale() {
        return "dell";
    }
}


/**
 * @Created by xiaodao
这个类进行解耦
 */
public  class Computer {


    protected Brand brand;

    public Computer(Brand brand) {
        this.brand = brand;
    }

    public void sale(){};

}

/**
 * @Created by xiaodao
 */
public class Laptop extends Computer {
    public Laptop(Brand brand) {
        super(brand);
    }


    @Override
    public void sale() {
        System.out.println("销售 "+ brand.sale()+"  笔记本");
    }
}

/**
 * @Created by xiaodao
 */
public class Disktop extends Computer {
    public Disktop(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        System.out.println(" 销售"+brand.sale()+" 台式机");
    }
}

/**
 * @Created by xiaodao
 */
public class Main {


    public static void main(String[] args) {
        Computer c = new Disktop(new Lenovo());
        c.sale();
        Computer c1 = new Laptop(new Lenovo());
        c1.sale();

        Computer c2 = new Laptop(new Dell());
        c2.sale();
    }

}

销售联想 台式机
销售 联想 笔记本
销售 dell 笔记本

总结:

讲具有多个属性的类进行分离,从而实现解耦.

要点:桥接类持有被桥接的接口一个引用 属性是proteced 因为需要子类去实现

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄