zoukankan      html  css  js  c++  java
  • java 设计模式 之 桥梁模式

    桥梁模式:将抽象和实现解耦,使两者可以独立的变化。解释:将两个有组合关系,强耦合的对象,各自抽象然后解耦。(类关系图看https://www.cnblogs.com/blogxiao/p/9513883.html 这篇文章)

    下面以公司生产产品为例子。

    1.小汽车公司生产小汽车。这里有两个对象:汽车公司和小汽车。这两个是聚合的关系。类关系图如下:

    业务逻辑就是:汽车公司生产汽车产品

    2.缺点:扩展性差,当有是个产品需要生产的时候,此时需要在往这里面的增加十个产品类。当有多个公司生产多个产品的时候,此时公司和类都会有多份。桥梁模式解决:公司可以有多个,产品可以有多个。每个公司都可以生产任意产品。

    将公司和产品抽象,当客户端想怎么随机组合都可以。

    3.具体的类实现通过idea 生成:

    注意1 和 2 的地方和上面的画的不一样,可以限定最小类型也可以限定父亲Product

    4.代码

    Product.java

    package javadesign.bridge;
    
    public abstract class Product {
    
        public abstract void beProducted();
    
        public abstract void beSelled();
    
    }

    Company.java

    package javadesign.bridge;
    
    public abstract class Company {
    
        Product product;
    
        public Company(Product product){
            this.product=product;
        }
    
         public  void makeMoney(){
            this.product.beProducted();
            this.product.beSelled();
         }
    
    }

    Product 的子类:CarProduct.java

    package javadesign.bridge.subpro;
    
    import javadesign.bridge.Product;
    
    public class CarPro extends Product {
    
        @Override
        public void beProducted() {
            System.out.println("生产汽车");
        }
    
        @Override
        public void beSelled() {
            System.out.println("卖汽车");
        }
    }

    Product 的子类:ToysProduct.java

    package javadesign.bridge.subpro;
    
    import javadesign.bridge.Product;
    
    public class ToysPro extends Product {
        @Override
        public void beProducted() {
            System.out.println("生产玩具");
        }
    
        @Override
        public void beSelled() {
            System.out.println("卖玩具");
        }
    }

    Company 的子类:carCompany

    package javadesign.bridge.subcop;
    
    import javadesign.bridge.Company;
    import javadesign.bridge.subpro.CarPro;
    
    public  class CarCompany extends Company {
    
        public CarCompany(CarPro product) {
            super(product);
        }
    
    
        @Override
        public void makeMoney() {
            super.makeMoney();
            System.out.println("公司卖车挣钱");
        }
    }

    Company 的子类:ToysCompany

    package javadesign.bridge.subcop;
    
    import javadesign.bridge.Company;
    import javadesign.bridge.subpro.ToysPro;
    
    public class ToysCompany extends Company {
    
        public ToysCompany(ToysPro product) {
            super(product);
        }
    
        @Override
        public void makeMoney()
        {
            super.makeMoney();
            System.out.println("公司挣卖玩具的钱");
        }
    }

    client.java

    package javadesign.bridge;
    
    
    import javadesign.bridge.subcop.CarCompany;
    import javadesign.bridge.subcop.ToysCompany;
    import javadesign.bridge.subpro.CarPro;
    import javadesign.bridge.subpro.ToysPro;
    
    public class Client {
    
        public static void main(String[] args) {
            CarPro carPro=new CarPro();
            Company company=new CarCompany(carPro);
            company.makeMoney();
    
            System.out.println("=======================");
    
            ToysPro toysPro=new ToysPro();
            Company company1=new ToysCompany(toysPro);
            company1.makeMoney();
        }
    
    }

    运行结果:

     5.通用的桥梁模式:

     

     

    桥梁模式的优点:解决不能多继承的缺点,在该模式下实现不受抽象的约束。

    应用场景:发现类的继承有N层的时候使用。

  • 相关阅读:
    linux脚本Shell之awk详解(二)
    linux脚本Shell之awk详解
    漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”
    漫谈计算摄像学 (一):直观理解光场(Light Field)
    利用OpenCV检测图像中的长方形画布或纸张并提取图像内容
    2048理论上最高能玩到多少分?
    蛋疼之作:99行代码的2048
    用一个玩具例子说明基于视频的超分辨率重建的基本思想
    [C++]二维数组还是一维数组?
    三维空间中如何寻找和一组给定直线垂直程度最高的直线
  • 原文地址:https://www.cnblogs.com/blogxiao/p/11012647.html
Copyright © 2011-2022 走看看