1. 程式人生 > >Java實現橋接模式

Java實現橋接模式

22.2 緊耦合程式演化

兩個手機品牌,都有遊戲,兩個手機是不同的作業系統。怎麼寫?
該有一個父類手機品牌遊戲,讓N和M品牌手機遊戲都繼承它。

如果N和M品牌手機又都增加了通訊錄功能呢?
這裡寫圖片描述

基於這個模型,那如果新增加一個手機品牌,並且每個手機品牌增加各種功能,例如:遊戲、通訊錄、MP3等。

那樣就會變得非常麻煩。

繼承的問題
無法在執行時改變從父類繼承的實現,子類和父類依賴關係緊密,父類中任何變化都會導致子類發生變化。
當複用子類時,如果繼承下來的子類不適合解決新問題,則父類必須重寫或被其他更適合的類替換,導致限制了複用性。

面向物件中首先使用合成/聚合複用原則

,即優先使用物件合成/聚合,而不是類繼承。

22.3 合成/聚合複用原則

聚合
表示“弱”的擁有關係,A物件可包含B物件,但B物件不是A物件的一部分;
合成
是一種“強”的擁有關係,部分和整體的生命週期是一樣的。

大雁和翅膀就類似於合成關係;每隻大雁是屬於一個雁群,一個雁群有多隻大雁,所以大雁和雁群是聚合關係。
這裡寫圖片描述

好處
優先使用物件的合成/聚合有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,且不太可能增長為不控制的龐然大物。

22.4 鬆耦合的程式

根據這個原則,修改之前的類結構。
這裡寫圖片描述
手機品牌包含有手機軟體,但軟體不是品牌的一部分,所以是聚合關係。

手機軟體

public abstract class HandsetSoft {
    public abstract void run();
}

遊戲、通訊錄等具體類

public class HandsetGame extends HandsetSoft {

    @Override
    public void run(){
        println("遊戲");
    }
}

public class HandsetAddress extends HandsetSoft {

    @Override
    public void run(){
        println("通訊錄"
); } }

手機品牌類

public abstract class HandsetBrand {
    //弱聚合
    protected HandsetSoft soft;

    //設定手機軟體
    public void setHandsetSoft(HandsetSoft soft){
        this.soft = soft;
    }

    //執行
    public abstract void run();
}

品牌N品牌M等具體類

//品牌N
class HandsetBrandN extends HandsetBrand {

    @Override
    public void run(){
        soft.run();
    }
}

//品牌M
class HandsetBrandM extends HandsetBrand {

    @Override
    public void run(){
        soft.run();
    }
}

客戶端

public class Main {
    HandsetBrand ab;
    //建立品牌N
    ab = new HandsetBrandN();

    //給品牌N安裝遊戲
    ab.setHandsetSoft(new HandsetGame());
    ab.run();

    //給品牌N安裝通訊錄
    ab.setHandsetSoft(new HandsetAddress());
    ab.run();
}

22.5 橋接模式

將抽象部分和它的實現部分分離,使它們都可以獨立的變化。

就像之前例子,讓手機既可以按品牌分類,也可以按功能來分類。
這裡寫圖片描述
Implementor類

public abstract class Implementor {
    public abstract void operation();
}

ConcreteImplementorA和ConcreteImplementorB等派生類

public class ConcreteImplementorA extends Implementor{
    @Override
    public void operation(){
        println("具體實現A的方法執行");
    }
}

public class ConcreteImplementorB extends Implementor{
    @Override
    public void operation(){
        println("具體實現B的方法執行");
    }
}

Abstraction類

public abstract class Abstraction {
    protected Implementor impl;

    public Abstraction(Implementor impl){
        this.impl = impl;
    }

    public abstract void operation();
}

RefinedAbstraction類

public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor impl){
        super(impl);
    }

    @Override
    public void operation(){
        impl.operation();
    }
}

客戶端實現

public class Main {
    public static void main(String[] args){
        Abstraction ab = new RefinedAbstraction(new ConcreteImplementorA());
        ab.operation();

        ab = new RefinedAbstraction(new ConcreteImplementorB());
        ab.operation();
    }
}

相關推薦

Java實現模式

22.2 緊耦合程式演化 兩個手機品牌,都有遊戲,兩個手機是不同的作業系統。怎麼寫? 該有一個父類手機品牌遊戲,讓N和M品牌手機遊戲都繼承它。 如果N和M品牌手機又都增加了通訊錄功能呢? 基於這個模型,那如果新增加一個手機品牌,並且每個手機品牌增

win10 VMware 虛擬機器 實現模式 上網

前言:    可能很多朋友想用VMware在自己的windows系統上體驗下其它作業系統或者執行某些只能在Linux上的軟體。但是可能自己買阿里雲或者騰訊雲感覺划不來。下面我來簡單的來告訴大家,運用VMware的橋接模式,可以讓大家像擁有另外一臺不同作業系統的電腦一樣在區域網

模式-Bridge(Java實現)

技術分享 world java實現 () open() count end ring idg 橋接模式-Bridge 橋梁模式的用意是"將抽象化(Abstraction)與實現化(Implementation)脫耦, 將"類的功能層次結構" 與 "類的實現層次結構"分離為

菜鳥版JAVA設計模式-從抽象與實現模式

橋接模式,初學的時候其實很不理解為什麼要把這個模式命名為橋接模式,腦海裡突然聯想到。其實我學習是一件比較痛苦的事情,因為我必須要知道來龍去脈才能學的進去,所以,很快我就對這個命名產生了興趣,橋接? 嗯,橋接!先把橋字換成連字,連線?橋接?橋接和連線最大的不同是橋接是降具有相

模式(java實現)

橋接模式 手機品牌M和N都有遊戲和通訊錄功能,都用繼承實現,程式碼如下. public  class Brand { public void run() {} } public class MBrand extends Brand{ } public class NBran

Java設計模式應用——模式

com log reat hdfs service() rri 不同類 適合 reg 性能管理系統中,數據產生後需要經過采集,匯聚,入庫三個流程,用戶才能查詢使用。 采集可以是snmp采集,也可以是ems采集;匯聚可以使storm匯聚,也可以是spark匯聚;入庫可以是hd

Java二十三設計模式之-----模式

second his manager man @override end html con 太多的 一、橋接模式(Bridge) 橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化。橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化,像我們常用的JDBC橋

java設計模式-模式

送禮物 one dea setname auth imp ide span pro 1.背景                       追MM的例子,Boy追MM,需要送禮物Gift,有Flower,Ring繼承自Gift; 還有WarmGift溫暖的禮物,WildGif

Java設計模式學習記錄-模式

www 方便 就是 奔騰 一個 splay public face mage 前言 這次介紹結構型設計模式中的第二種模式,橋接模式。 使用橋接模式的目的就是為了解耦,松散的耦合更利於擴展,但是會增加相應的代碼量和設計難度。 橋接模式 橋接模式是為了將抽象化與實現

Java進階篇設計模式之四 -----適配器模式模式

原則 pub 是我 protect 接口 logs 將不 多說 外鏈 前言 在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。 適配器模式 簡介 適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於結構型模

java面試題之----jdbc中使用的設計模式模式

connect @override 操作 tro orb his order ng- return 1.JDBC(JavaDatabase Connectivity) JDBC是以統一方式訪問數據庫的API. 它提供了獨立於平臺的數據庫訪問,也就是說,有了JDB

java設計模式5.組合模式、門面模式、享元模式模式

組合模式 在面向物件的語言中,樹結構有著巨大的威力,一個基於繼承的型別的等級結構便是一個數結構,一個基於合成的物件結構也是一個數結構。組合模式將部分與整體的關係用樹結構表示出來,使得客戶端把一個個單獨的成分物件和由它們組合而成的合成物件同等看待。 抽象構建角色:一個抽象角色,給參加組合的物

JAVA開發的23種設計模式之 --- 模式

橋接模式    概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.    應用場景      &n

Java設計模式9:模式

一、橋接模式: 橋接模式是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。 二、示例程式碼: 先來考慮下如下場景: 傳送訊息功能。基本上所有帶業務流程處理的系統都會有這樣的功能,比如OA上

重走Java設計模式——模式(Bridge Pattern)

橋接模式 定義 將抽象部分與實現部分分離,使它們都可以獨立的變化。 結構詳解 橋接模式主要包含如下幾個角色: 1.Abstraction:抽象類; 2.RefinedAbstraction:擴充抽象類; 3.Implementor:實現類介面; 4.Co

23種設計模式之(十)模式(python_c++實現

23種設計模式之(十)橋接模式(Bridge) 本文主要介紹23種設計模式之組合模式,附詳細python/c++示例程式碼。 - 概念 - 應用場景 - 注意事項 - 程式碼示例 - 總結 - 程式碼連結 橋接模式(Bridge)

《大話設計模式Java程式碼示例(十八)之模式

橋接模式(Bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 package bridge; /** * 橋接模式(Bridge) * 手機軟體抽象類 */ public abstract class PhoneSoft { pu

java 模式

橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。 1)介面卡:改變已有的兩個介面,讓他們相容。 2)橋接模式:分離抽象化和實現,使兩者的介面可以不同,目的是分離。 /** * @author liusongwei

JAVA設計模式(7):模式

橋接模式將定義與其實現分離。 它是一種結構模式。 橋接(Bridge)模式涉及充當橋接的介面。橋接使得具體類與介面實現者類無關。 這兩種型別的類可以改變但不會影響對方。當需要將抽象與其實現去耦合時使用橋接解耦(分離),使得兩者可以獨立地變化。這種型別的設計模式屬於結構模式,因為此模式通過在它

通過例子學設計模式之--模式以及使用場景說明(C++實現)

             橋是一種結構。橋接模式的類圖和橋很像,是一種結構型的設計模式。             通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。