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


    桥接模式

    场景分析:

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

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

    不是使用桥接模式

    类图:

    代码:

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

  • 相关阅读:
    EPANET头文件解读系列4——EPANET2.H
    EPANET头文件解读系列3——TOOLKIT.H
    EPANET头文件解读系列2——ENUMSTXT.H
    EPANET头文件解读系列1——TEXT.H
    ENUMSTXT.H中的指针数组
    main函数的参数
    函数指针与指针函数
    FMDB源码阅读
    17个提升iOS开发效率的必用工具
    UIKit性能调优实战讲解
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10843809.html
Copyright © 2020-2023  润新知