java 設計模式 之 橋樑模式

橋樑模式:將抽象和實現解耦,使二者能夠獨立的變化。解釋:將兩個有組合關係,強耦合的對象,各自抽象而後解耦。(類關係圖看https://www.cnblogs.com/blogxiao/p/9513883.html 這篇文章)html

下面以公司生產產品爲例子。java

1.小汽車公司生產小汽車。這裏有兩個對象:汽車公司和小汽車。這兩個是聚合的關係。類關係圖以下:ide

業務邏輯就是:汽車公司生產汽車產品this

 

2.缺點:擴展性差,當有是個產品須要生產的時候,此時須要在往這裏面的增長十個產品類。當有多個公司生產多個產品的時候,此時公司和類都會有多份。橋樑模式解決:公司能夠有多個,產品能夠有多個。每一個公司均可以生產任意產品。idea

 

將公司和產品抽象,當客戶端想怎麼隨機組合均可以。spa

 

3.具體的類實現經過idea 生成:code

注意1 和 2 的地方和上面的畫的不同,能夠限定最小類型也能夠限定父親Producthtm

 

4.代碼對象

Product.javablog

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層的時候使用。

相關文章
相關標籤/搜索