設計模式——橋接模式(C++實現)

来源:http://www.cnblogs.com/070412-zwc/archive/2017/05/22/6891271.html
-Advertisement-
Play Games

參考: http://www.cnblogs.com/jiese/p/3164940.html http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/bridge.html ...


 

  1 [root@ ~/learn_code/design_pattern/18_bridge]$ cat Abstraction.h
  2 #ifndef _ABSTRACTION_H_
  3 #define _ABSTRACTION_H_
  4 
  5 class AbstractionImplement;
  6 
  7 class Abstraction
  8 {
  9 public:
 10     virtual void Operation()=0;//定義介面,表示該類所支持的操作
 11     virtual ~Abstraction();
 12 protected:
 13     Abstraction();
 14 };
 15 
 16 class RefinedAbstractionA:public Abstraction
 17 {
 18 public:
 19     RefinedAbstractionA(AbstractionImplement* imp);//構造函數
 20     virtual void Operation();//實現介面
 21     virtual ~RefinedAbstractionA();//析構函數
 22 private:
 23     AbstractionImplement* _imp;//私有成員
 24 };
 25 
 26 class RefinedAbstractionB:public Abstraction
 27 {
 28 public:
 29     RefinedAbstractionB(AbstractionImplement* imp);//構造函數
 30     virtual void Operation();//實現介面
 31     virtual ~RefinedAbstractionB();//析構函數
 32 private:
 33     AbstractionImplement* _imp;//私有成員
 34 };
 35 #endif
 36 
 37 
 38 [root@ ~/learn_code/design_pattern/18_bridge]$ cat Abstraction.cpp
 39 #include "Abstraction.h"
 40 #include "AbstractionImplement.h"
 41 #include <iostream>
 42 
 43 using namespace std;
 44 
 45 Abstraction::Abstraction()
 46 {}
 47 
 48 Abstraction::~Abstraction()
 49 {}
 50 
 51 RefinedAbstractionA::RefinedAbstractionA(AbstractionImplement* imp)
 52 {
 53     this->_imp = imp;
 54 }
 55 
 56 RefinedAbstractionA::~RefinedAbstractionA()
 57 {
 58     delete this->_imp;
 59     this->_imp = NULL;
 60 }
 61 
 62 void RefinedAbstractionA::Operation()
 63 {
 64     cout << "RefinedAbstractionA::Operation" << endl;
 65     this->_imp->Operation();
 66 }
 67 
 68 RefinedAbstractionB::RefinedAbstractionB(AbstractionImplement* imp)
 69 {
 70     this->_imp = imp;
 71 }
 72 
 73 RefinedAbstractionB::~RefinedAbstractionB()
 74 {
 75     delete this->_imp;
 76     this->_imp = NULL;
 77 }
 78 
 79 void RefinedAbstractionB::Operation()
 80 {
 81     cout << "RefinedAbstractionB::Operation" << endl;
 82     this->_imp->Operation();
 83 }
 84 
 85 
 86 [root@ ~/learn_code/design_pattern/18_bridge]$ cat AbstractionImplement.h
 87 #ifndef _ABSTRACTIONIMPLEMENT_H_
 88 #define _ABSTRACTIONIMPLEMENT_H_
 89 
 90 //抽象基類,定義了實現的介面
 91 class AbstractionImplement
 92 {
 93 public:
 94     virtual void Operation()=0;//定義操作介面
 95     virtual ~AbstractionImplement();
 96 protected:
 97     AbstractionImplement();
 98 };
 99 
100 // 繼承自AbstractionImplement,是AbstractionImplement的不同實現之一
101 class ConcreteAbstractionImplementA:public AbstractionImplement
102 {
103 public:
104     ConcreteAbstractionImplementA();
105     void Operation();//實現操作
106     ~ConcreteAbstractionImplementA();
107 protected:
108 };
109 
110 // 繼承自AbstractionImplement,是AbstractionImplement的不同實現之一
111 class ConcreteAbstractionImplementB:public AbstractionImplement
112 {
113 public:
114     ConcreteAbstractionImplementB();
115     void Operation();//實現操作
116     ~ConcreteAbstractionImplementB();
117 protected:
118 };
119 #endif
120 
121 
122 [root@ ~/learn_code/design_pattern/18_bridge]$ cat AbstractionImplement.cpp
123 #include "AbstractionImplement.h"
124 #include <iostream>
125 
126 using namespace std;
127 
128 AbstractionImplement::AbstractionImplement()
129 {}
130 
131 AbstractionImplement::~AbstractionImplement()
132 {}
133 
134 ConcreteAbstractionImplementA::ConcreteAbstractionImplementA()
135 {}
136 
137 ConcreteAbstractionImplementA::~ConcreteAbstractionImplementA()
138 {}
139 
140 void ConcreteAbstractionImplementA::Operation()
141 {
142     cout << "ConcreteAbstractionImplementA Operation" << endl;
143 }
144 
145 ConcreteAbstractionImplementB::ConcreteAbstractionImplementB()
146 {}
147 
148 ConcreteAbstractionImplementB::~ConcreteAbstractionImplementB()
149 {}
150 
151 void ConcreteAbstractionImplementB::Operation()
152 {
153     cout << "ConcreteAbstractionImplementB Operation" << endl;
154 }
155 
156 
157 [root@ ~/learn_code/design_pattern/18_bridge]$ cat main.cpp
158 #include "Abstraction.h"
159 #include "AbstractionImplement.h"
160 #include <iostream>
161 
162 using namespace std;
163 
164 int main()
165 {
166     /* 將抽象部分與它的實現部分分離,使得它們可以獨立地變化
167 
168     1、抽象Abstraction與實現AbstractionImplement分離;
169 
170     2、抽象部分Abstraction可以變化,如new RefinedAbstractionA(imp)、new RefinedAbstractionB(imp2);
171 
172     3、實現部分AbstractionImplement也可以變化,如new ConcreteAbstractionImplementA()、new ConcreteAbstractionImplementB();
173 
174     */
175 
176     AbstractionImplement* imp = new ConcreteAbstractionImplementA();        //實現部分ConcreteAbstractionImplementA
177     Abstraction* abs = new RefinedAbstractionA(imp);                        //抽象部分RefinedAbstractionA
178     abs->Operation();
179 
180     cout << "-----------------------------------------" << endl;
181 
182     AbstractionImplement* imp1 = new ConcreteAbstractionImplementB();        //實現部分ConcreteAbstractionImplementB
183     Abstraction* abs1 = new RefinedAbstractionA(imp1);                        //抽象部分RefinedAbstractionA
184     abs1->Operation();
185 
186     cout << "-----------------------------------------" << endl;
187 
188     AbstractionImplement* imp2 = new ConcreteAbstractionImplementA();        //實現部分ConcreteAbstractionImplementA
189     Abstraction* abs2 = new RefinedAbstractionB(imp2);                        //抽象部分RefinedAbstractionB
190     abs2->Operation();
191 
192     cout << "-----------------------------------------" << endl;
193 
194     AbstractionImplement* imp3 = new ConcreteAbstractionImplementB();        //實現部分ConcreteAbstractionImplementB
195     Abstraction* abs3 = new RefinedAbstractionB(imp3);                        //抽象部分RefinedAbstractionB
196     abs3->Operation();
197 
198     cout << endl;
199     return 0;
200 }

 

參考:

  http://www.cnblogs.com/jiese/p/3164940.html

      http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/bridge.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在這裡我們要說的拓撲排序是有前提的 我們在這裡說的拓撲排序是基於有向無環圖的!!!。 (⊙o⊙)…我所說的有向無環圖都知道是什麼東西吧。。 如果不知道,我們下麵先來來說說什麼是有向無環圖。 所謂有向無環圖,顧名思義是不存在環的有向圖(至於有向圖是什麼不知道的在前面我們有一個圖論講解上都有)。 點的入 ...
  • ★☆ 輸入文件:2015message.in 輸出文件:2015message.out 簡單對比 時間限制:1 s 記憶體限制:256 MB 【題目描述】 有n個同學(編號為1到n)正在玩一個信息傳遞的游戲。在游戲里每人都有一個固定的信息傳遞對象,其中,編號為i的同學的信息傳遞對象是編號為Ti同學。 ...
  • 今天繼續函數的講解: 目錄: 1.函數對象 2.函數嵌套 3.名稱空間和作用域 4.閉包 5.裝飾器 6.迭代器 7.生成器 8.內置函數 第一部分:函數對象 在python中,一切皆對象,想int,str,list,dict,tuple等等,所以函數也不例外,對象都具有屬性。作為對象,它可以賦值給 ...
  • 最近工作中要用到搜索引擎,由於目前用的搜索引擎是LeanCloud 提供的 ,不太好用,不支持範圍等搜索,而且每天還收費30元,請求次數也有限制。基於這些原因,我們只好在自己的伺服器上部署搜索引擎了。 經過一番調研結合我們自身的技術,選擇使用Elasticsearch,下麵介紹Elasticsear ...
  • xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。從結構上,很像HTML超文本標記語言。但他們被設計的目的是不同的,超文本標記語言被設計用來顯示數據,其焦點是數據的外觀。它被設計用來傳輸和存儲數據,其焦點是數據的內容。那麼Python是如何處理 ...
  • 設計模式三—抽象工廠模式 一、定義 抽象工廠模式是工廠方法模式的進一步抽象。如果產品簇中只有一種產品,則退化為工廠方法模式。 二、原理圖 三、代碼實例 * 蘋果和土豆是園丁1的傑作 * 葡萄和西紅柿是園丁2的傑作 1、Fruit.java 2、Apple.java 3、Grape.java 4、Ve ...
  • 設計模式二—工廠方法模式 一、工廠方法模式優點 良好的封裝性 優秀的可擴展性 屏蔽產品類 典型的解耦架構 二、實例 三、實例代碼 1、Fruit.java public interface Fruit { /* * 生長 * 收穫 * 栽種 */ public void grow(); public ...
  • 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 cla... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...