再战设计模式(八)之桥接模式

桥接模式

场景分析:

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

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

不是使用桥接模式

类图:

代码:

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

类图:

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

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

代码如下:

/**
 * @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 因为需要子类去实现

原文地址:https://www.cnblogs.com/bj-xiaodao/p/10843809.html