桥接模式

场景分析:
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
这个场景中有两个变化的维度:电脑类型、电脑品牌。
不是使用桥接模式
类图:
代码:

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"); } }
像原来这样的的层次结构,如果我们要新添加一个品牌的话,我们需要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 因为需要子类去实现