13結構型模式之橋接模式

概念

  Bridge 模式又叫做橋接模式,是構造型的設計模式之一。Bridge模式基于類的最小設計原則,通過使用封裝,聚合以及繼承等行為來讓不同的類承擔不同的責任。它的主要特點是把抽象(abstraction)與行為實現(implementation)分離開來,從而可以保持各部分的獨立性以及應對它們的功能擴展。

?

角色和職責

Client

??? Bridge模式的使用者

Abstraction

??? 抽象類接口(接口或抽象類)維護對行為實現(Implementor)的引用

Refined Abstraction

??? Abstraction子類

Implementor

??? 行為實現類接口 (Abstraction接口定義了基于Implementor接口的更高層次的操作)

ConcreteImplementor

  Implementor子類

?

?適用于:

橋接模式(Bridge?Pattern)是將抽象部分與實現部分分離(解耦合),使它們都可以獨立的變化。

???????? 車 安裝 發動機 ;不同型號的車,安裝不同型號的發動機

???????? 圖形 填 顏色 ???不同形狀的圖形,填充上 不同的顏色

將“車 安裝 發動機”這個抽象 和 實現進行分離;兩個名字 就設計兩個類;

將“圖形 填 顏色”這個抽象 和 實現 進行分離,兩個名字,就設計兩個類

?

?

案例

//不同的車型,不同型號,安裝不同類型的發動機

#include <iostream>
using namespace std;class MyCar1
{
public:virtual void installEngine() = 0;
};class BMW5 : public MyCar1
{
public:virtual void installEngine(){cout << "BMW5 3500CC" << endl;}
};class BMW6 : public MyCar1
{
public:virtual void installEngine(){cout << "BMW6 4000CC" << endl;}
};class Jeep11 : public MyCar1
{
public:virtual void installEngine(){cout << "Jeep11 1100CC" << endl;}
};class Jeep12 : public MyCar1
{
public:virtual void installEngine(){cout << "Jeep12 1200CC" << endl;}
};//不同的車型,不同型號,安裝不同類型的發動機,會引起子類的泛濫
//問題引出
void main1601()
{Jeep12 *j12 = new Jeep12;j12->installEngine();delete j12;return ;
}class MyCar2
{public:virtual void installEngine3500() = 0;virtual void installEngine4000() = 0;virtual void installEngine1100() = 0;virtual void installEngine1200() = 0;
};class BMW : public MyCar2
{
public:virtual void installEngine3500(){cout << "3500CC" << endl;}virtual void installEngine4000(){cout << "4000CC" << endl;}virtual void installEngine1100() {cout << "1100CC" << endl;}virtual void installEngine1200(){cout << "1200CC" << endl;}
};//這樣的設計 不符合開閉原則
void main1602()
{BMW *bmw5 = new BMW;bmw5->installEngine3500();
}//需要把“安裝發動機”這個事,做很好的分解;把抽象 和 行為實現 分開
//發動機是一個名次,專門抽象成一個類;類中含有一個成員函數,安裝發動機class Engine
{
public:virtual void installEngine() = 0;
};class Engine4000 : public Engine
{
public:virtual void installEngine(){cout << "安裝發動機 Engine4000" << endl;}
};class Engine3500 : public Engine
{
public:virtual void installEngine(){cout << "安裝發動機 Engine 3500" << endl;}
};class Car
{
public:Car(Engine *pengine){m_engine = pengine;}virtual void installEngine() = 0;protected:Engine *m_engine;
};class BMW7 :public Car
{
public:BMW7(Engine *p) : Car(p){}//注意車的安裝  和 發動機的安裝 不同之處virtual void installEngine(){cout << "BMW7 " ; m_engine->installEngine();}
protected:
private:
};void main163()
{Engine4000 *e4000 = new Engine4000;BMW7 *bmw7 = new BMW7(e4000);bmw7->installEngine();delete bmw7;delete e4000;
}
void main()
{//main1601();//main1602();main163();system("pause");
}

  

?

轉載于:https://www.cnblogs.com/gd-luojialin/p/10357987.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387453.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

話說Svn與Git的區別

把第一條理解到位思想到位了做起來才會有的放矢&#xff0c;其他幾條都是用的時候才能體會到 1) 最核心的區別Git是分布式的&#xff0c;而Svn不是分布的。能理解這點&#xff0c;上手會很容易&#xff0c;聲明一點Git并不是目前唯一的分布式版本控制系統&#xff0c;還有比如M…

Ubuntu下Postgres安裝與配置

postgres8.4安裝配置&#xff1a;1.安裝postgres8.4~$ sudo apt-get install postgresql 2.修改超級管理員postgres密碼&#xff1a;以系統用戶運行psql~$ sudo -u postgres psql postgres修改postgres密碼(123456)postgres# /password postgres 3.備份修改的配置文件&#xff…

2.11 queue

#include<queue> 先進先出&#xff08;First In First Out, FIFO&#xff09; 隊尾插入&#xff0c;隊首刪除 queue<int> q; q.push(1); //入隊 int qf q.front(); //獲取隊首元素 int qe q.back(); //獲取隊尾元素 q.pop(); //出隊 q.size(); //大小 q.…

簡易中控紫貓插件版(3)壓縮包使用說明

1.環境配置腳本運行環境&#xff1a;沒什么說的 正常的最新版手機按鍵 當然還需要 最新的紫貓插件中控運行環境&#xff1a;首先要保證把壓縮包的所有php文件都扔到網站的根目錄下 必須保證網站的php版本是5.4 不然紫貓插件的php框架會出問題 然后你要知道網站數據庫的賬號和密…

Java9新特性

Java 8 發布三年多之后&#xff0c;即將快到2017年7月下一個版本發布的日期了。 你可能已經聽說過 Java 9 的模塊系統&#xff0c;但是這個新版本還有許多其它的更新。 這里有九個令人興奮的新功能將與 Java 9 一起發布。 1. Java 平臺級模塊系統 Java 9 的定義功能是一套全新的…

IOS 應用中從豎屏模式強制轉換為橫屏模式

在 iPhone 應用里&#xff0c;有時我們想強行把顯示模式從縱屏改為橫屏&#xff08;反之亦然&#xff09;&#xff0c;CocoaChina 會員 “alienblue” 為我們提供了兩種思路第一種&#xff1a;通過人為的辦法改變view.transform的屬性。具體辦法&#xff1a;view.transform一般…

2.12 priority_queue

#include<queue> priority_queue與queue的不同&#xff1a;最大元素位于隊首 priority_queue<int> pq; pq.push(1); //入隊 pq.pop(); //出隊 int i pq.top(); //獲取隊首元素 pq.size(); //大小 pq.empty(); //判空 如果隊列元素是結構體&#xff0c;重載&…

vue資料鏈接

vue 官方api&#xff1a;https://cn.vuejs.org/ vue資源精選&#xff1a;http://vue.awesometiny.com/ vue GitHub地址&#xff1a;https://github.com/vuejs/vue element-ui 官方中文api&#xff1a;http://element-cn.eleme.io/#/zh-CN/component/dropdown swiper中文網&…

Java面試常見算法

在程序員的職業生涯中&#xff0c;算法亦算是一門基礎課程&#xff0c;尤其是在面試的時候&#xff0c;很多公司都會讓程序員編寫一些算法實例&#xff0c;例如快速排序、二叉樹查找等等。 本文總結了程序員在代碼面試中最常遇到的10大算法類型&#xff0c;想要真正了解這些算法…

高仿人人Android夢想版終極源碼發送(轉)

經過幾個月的努力,終于基本完成了人人API擁有的所有功能,界面采用仿照人人夢想版5.13制作,其中資源文件也采用人人的APK文件資源,完成的功能及知識點如下:1.通過三種動畫仿照出人人引導頁的放大切換圖片的效果。2.通過重寫ViewGroup仿照出人人菜單和其他界面的手勢滑動切換效果…

HBase 基本Java API

數據庫&#xff1a;HBaseConfiguration HBaseAdmin 表&#xff1a;HTable HTableDescriptor 列族&#xff1a;HColumnDescriptor 行列操作&#xff1a;Put Get Scanner HBaseConfiguration: Configuration create() //從classpath中查找hbase-site.xml初始化Configu…

A1075.PAT Judge

題意 輸入k個程序的每個程序的滿分分數&#xff0c;再輸入m條用戶提交的記錄。按要求進行分數的排序最后輸出。是一道結構體的復雜排序 思路分析 首先明確本題的輸出要求&#xff1a; 編譯失敗的提交分數為-1。只有至少成功提交過一次程序(沒有編譯失敗),的用戶才會被排序。可以…

android 實現SSL握手協商

Android的私鑰和信任證書的格式必須是BKS格式的&#xff0c;通過配置本地JDK&#xff0c;讓keytool可以生成BKS格式的私鑰和信任證書,java本身沒有BouncyCastle密庫 ssl通道建立前必須進行協商&#xff08;形成安全的通道--隧道技術&#xff09;。 服務端&#xff1a; View Co…

同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO

IO的方式通常分為幾種&#xff0c;同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前&#xff0c;我們建立網絡連接的時候采用BIO模式&#xff0c;需要先在服務端啟動一個ServerSocket&#xff0c;然后在客戶端啟動Socket來對服務端進行通信&#x…

1 概述

Unix C TCP/IP 三位一體 Linux天生是網絡操作系統 程序員的學習&#xff1a;不斷地敲代碼&#xff0c;不斷地看別人的代碼。 Linux兩大領域&#xff1a; &#xff08;1&#xff09;服務器 &#xff08;2&#xff09;嵌入式設備 www.netcraft.com 查看網站服務器系統 VMware快…

對我影響最大的三位老師

讀書也讀了那么多年了&#xff0c;遇見了許多的老師&#xff0c;他們教不同的科目&#xff0c;各司其職&#xff0c;兢兢業業的做著自己的本職工作。在我的學生時代印象最深的有三位老師。第一位是我的初中語文老師鄒老師&#xff0c;他上課非常有趣&#xff0c;語文課&#xf…

Java Annotation認知(包括框架圖、詳細介紹、示例說明)

摘要 Java Annotation是JDK5.0引入的一種注釋機制。 網上很多關于Java Annotation的文章&#xff0c;看得人眼花繚亂。Java Annotation本來很簡單的&#xff0c;結果說的人沒說清楚&#xff1b;弄的看的人更加迷糊。 我按照自己的思路&#xff0c;對Annotation進行了整理。理解…

matlab練習程序(RGB2HSL、HSL2RGB)

色相飽和度亮度和三原色的相互轉換 function mainimgimread(lena_color.jpg);imgmat2gray(img); %任意區間映射到[0,1];[m n dim]size(img);imshow(img);%%圖像的RGBRimg(:,:,1);Gimg(:,:,2);Bimg(:,:,3);%%圖像RGB2HSLHzeros(m,n); %色相角Szeros(m,n); %飽和度Lzeros(m,…

2 文件處理、權限管理、搜索

文件處理命令&#xff1a; ls -a -l -d -h -i mkdir -p parents cd . .. /tmp/Japan pwd rmdir cp -r -p source destination 可改名recursive preserve mv source destination 剪切文件 改名 ctrl l 清屏 或者 clear命令 rm -r -f touch 新建文件 帶空格需加…

第38節: Vue3 鼠標按鈕修改器

在UniApp中使用Vue3框架時&#xff0c;你可以使用按鍵修飾符來更精確地處理鍵盤事件。以下是一個示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用.left、.right和.middle按鍵修飾符&#xff1a; <template> <view> <input keydown"handleKeyDown&…