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层的时候使用。

  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/blogxiao/p/11012647.html
Copyright © 2011-2022 走看看