設計模式--1(設計模式基礎,設計模式基本原則,設計模式分類)

設計模式基礎

模式

  1. 在一定環境中解決某一問題的方案,包括三個基本元素–問題,解決方案和環境。
  2. 大白話:在一定環境下,用固定套路解決問題。

設計模式

是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計 模式是為了可重用代碼、讓代碼更容易被他人理解、保證代 碼可靠性。 毫無疑問,設計模 式于己于他人于系統都是多贏的;設計模式使代碼編制真正工程化;
設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。

設計模式分類

GangofFour 的“DesignPatterns:ElementsofResualbelSoftware”書將設計模式歸納為 三大類型,共 23 種。

  1. 創建型模式 : 通常和對象的創建有關,涉及到對象實例化的方式。(共 5 種模式)
  2. 結構型模式: 描述的是如何組合類和對象以獲得更大的結構。(共 7 種模式)
  3. 行為型模式: 用來對類或對象怎樣交互和怎樣分配職責進行描述。(共 11 種模式)
    在這里插入圖片描述
    在這里插入圖片描述

創建型模式

用來處理對象的創建過程

工廠方法模式(FactoryMethodPattern)

定義一個創建產品對象的工廠接口, 將實際創建工作推遲到子類中。

抽象工廠模式(AbstractFactoryPattern)

提供一個創建一系列相關或者相互依 賴的接口,而無需指定它們具體的類。

建造者模式(BuilderPattern)

將一個復雜的構建與其表示相分離,使得同樣的 構建過程可以創建不同的表示。

原型模式(PrototypePattern

用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。

單例模式(SingletonPattern)

是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

結構型模式

處理類或者對象的組合

代理模式(ProxyPattern)

為其他對象提供一種代理以控制對這個對象的訪問

裝飾者模式(DecoratorPattern)

給一個對象添加一些額外的職責。就增加功能來 說,此模式比生成子類更為靈活。

適配器模式(AdapterPattern)

將一個類的接口轉換成客戶希望的另外一個接口。使得 原本由于接口不兼容而不能一起工作的那些類可以一起工作

橋接模式(BridgePattern)

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

組合模式(CompositePattern)

將對象組合成樹形結構以表示“部分–整體”的層次結 構。使得用戶對單個對象和組合對象的使用具有一致性

外觀模式(FacadePattern)

為子系統中的一組接口提供一個一致的界面,此模式定義 了一個高層接口,這個接口使得這一子系統更加容易使用

享元模式(FlyweightPattern)

以共享的方式高效的支持大量的細粒度的對象。

行為型模式

用來對類或對象怎樣交互和怎樣分配職責進行描述

模板方法模式(TemplateMethodPattern)

使得子類可以不改變一個算法的結構即可重 定義該算法的某些特定步驟。

命令模式(CommandPattern)

將一個請求封裝為一個對象,從而使你可用不同的請 求對客戶端進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作

責任鏈模式(ChainofResponsibilityPattern)

在該模式里,很多對象由每一個對象對其 下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理 此請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任

策略模式(StrategyPattern)

是準備一組算法,并將每一個算法封裝起來,使得它們 可以互換。

中介者模式(MediatorPattern)

定義一個中介對象來封裝系列對象之間的交互。終 結者使各個對象不需要顯示的相互調用 ,從而使其耦合性松散,而且可以獨立的改變他們 之間的交互。

觀察者模式(ObserverPattern)

定義對象間的一種一對多的依賴關系,當一個對象的狀 態發生改變時,所有依賴于它的對象都得到通知并被自動更新。

備忘錄模式(MementoPattern)

是在不破壞封裝的前提下,捕獲一個對象的內部狀態, 并在該對象之外保存這個狀態。

訪問者模式(VisitorPattern)

就是表示一個作用于某對象結構中的各元素的操作,它使 你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

狀態模式(StatePattern)

對象的行為,依賴于它所處的狀態

解釋器模式(InterpreterPattern)

描述了如何為簡單的語言定義一個語法,如何在 該語言中表示一個句子,以及如何解釋這些句子。

迭代器模式(IteratorPattern)

提供了一種方法順序來訪問一個聚合對象中的各個元 素,而又不需要暴露該對象的內部表示。

設計模式基本原則

最終目的:高內聚,低耦合

開放封閉原則 (OCP,OpenForExtension,ClosedForModificationPrinciple)

類的改動是通過增加代碼進行的,而不是修改源代碼。

#include<iostream>using namespace std;
//開閉原則//寫一個抽象類
class AbstractCaculator
{
public:virtual int getResult() = 0;virtual void setOperatorNumber(int a, int b) = 0;};//加法計算器
class PlusCaculator :public AbstractCaculator{
public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA + mB;}
private:int mA;int mB;
};//減法計算器
class MinuteCaculator :public AbstractCaculator{
public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA - mB;}
private:int mA;int mB;
};//乘法計算器
class MultiplyCaculator :public AbstractCaculator{
public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult(){return mA * mB;}
private:int mA;int mB;
};void test01()
{//父類指針指向基類對象AbstractCaculator * caculator = new PlusCaculator;caculator->setOperatorNumber(10, 20);cout << "ret:" << caculator->getResult() << endl;caculator = new  MultiplyCaculator;caculator->setOperatorNumber(30,20);cout << "ret:" << caculator->getResult() << endl;
}int main(void)
{test01();system("pause");return 0;
}

我們如果想再次增加計算器類型,只用繼承基類,重寫方法就可以了。

單一職責原則 (SRP,SingleResponsibilityPrinciple)

類的職責要單一,對外只提供一種功能,而引起類變化的原因都應該只有一個。

依賴倒置原則 (DIP,DependenceInversionPrinciple)

依賴于抽象(接口),不要依賴具體的實現(類),也就是針對接口編程。
在這里插入圖片描述

#include<iostream>
using namespace std;class BankWorker{
public:void SaveService(){cout << "辦理存款業務..." << endl;}void payService(){cout << "辦理支付業務.." << endl;}void tranferService(){cout << "辦理轉賬業務..." << endl;}
};void doSaveBussiness(BankWorker *worker){worker->SaveService();
}
void doPayBussiness(BankWorker *worker){worker->payService();
}
void doTransferBussiness(BankWorker *worker){worker->tranferService();
}void test01(){BankWorker *worker = new BankWorker;doSaveBussiness(worker);//辦理存款業務doPayBussiness(worker);//辦理支付業務doTransferBussiness(worker);//辦理轉賬業務
}int main(void)
{system("pause");return 0;
}

在這里插入圖片描述

//銀行工作人員
class AbstractWotker{
public:virtual void doBussiness() = 0;};//專門負責辦理存款業務的工作人員
class doSaveBankWorker :public AbstractWotker{
public:virtual void doBussiness(){cout << "辦理存款業務.." << endl;}
};class PaySaveBankWorker :public AbstractWotker{
public:virtual void doBussiness(){cout << "辦理支付業務.." << endl;}
};class TransferSaveBankWorker :public AbstractWotker{
public:virtual void doBussiness(){cout << "辦理轉賬業務.." << endl;}
};//中層業務,依賴于抽象層,bu
void doNewBusiness(AbstractWotker * worker){worker->doBussiness();delete worker;
}void test02()
{doNewBusiness(new TransferSaveBankWorker);doNewBusiness(new doSaveBankWorker);doNewBusiness(new PaySaveBankWorker);
}int main(void)
{//test01();system("pause");return 0;
}

接口隔離原則 (ISP,InterfaceSegegationPrinciple)

不應該強迫客戶的程序依賴他們不需要的接口方法。一個接口應該只提供一種對外功能, 不應該把所有操作都封裝到一個接口中去。

里氏替換原則 (LSP,LiskovSubstitutionPrinciple)

任何抽象類出現的地方都可以用他的實現類進行替換。實際就是虛擬機制,語言級別實 現面向對象功能。

合成復用原則(CARP,Composite/AggregateReusePrinciple)

優先使用組合而不是繼承原則。如果使用繼承,會導致父類的任何變換都可能影響到子類的行為。 如果使用對象組合,就降低了這種依賴關系。

#include<iostream>
using namespace std;class AbstractCar{
public:virtual void run() = 0;};class Dazhong :public AbstractCar{
public:virtual void run(){cout << "大眾車啟動..." << endl;}
};class Tuolaji :public AbstractCar{
public:virtual void run(){cout << "拖拉機啟動.." << endl;}
};//針對具體類,不使用繼承
#if 0
class Person :public Tuolaji{
public:void Doufeng(){run();}
};class PersonB :public Tuolaji{
public:void Doufeng(){run();}
};
#endif//用組合
class Person{
public:/*~Person(){if (this->car != NULL){delete this->car;}}*/void setCar(AbstractCar *car){this->car = car;}void Doufeng(){this->car->run();if (this->car != NULL){delete this->car;this->car = NULL;}}public:AbstractCar *car;
};void test02(){Person* p = new Person;p->setCar(new Dazhong);p->Doufeng();p->setCar(new Tuolaji);p->Doufeng();delete p;
}//繼承和組合優先使用組合
int main()
{test02();system("pause");return 0;
}

迪米特法則(LOD,LawofDemeter)

一個對象應當對其他對象盡可能少的了解,從而降低各個對象之間的耦合,提高系統的 可維護性。例如在一個程序中,各個模塊之間相互調用時,通常會提供一個統一的接口來實 現。這樣其他模塊不需要了解另外一個模塊的內部實現細節,這樣當一個模塊內部的實現發 生改變時,不會影響其他模塊的使用。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
//迪米特原則,又叫最小知識原則,不要暴露內部結構,只提供接口class AbstractBuiding
{
public:virtual void sale() = 0;virtual string getQuality() = 0;
};//樓盤A
class BuildingA :public AbstractBuiding
{
public:BuildingA(){mQuity = "高品質";}virtual void sale(){cout << "樓盤A" << mQuity << "被售賣";}virtual string getQuality(){return mQuity;}
public:string mQuity;
};//樓盤B
class BuildingB :public AbstractBuiding
{
public:BuildingB(){mQuity = "低品質";}virtual void sale(){cout << "樓盤B" << mQuity << "被售賣";}virtual string getQuality(){return mQuity;}
public:string mQuity;
};
#if 0
void test01()
{BuildingA * ba = new BuildingA;if (ba->mQuity == "低品質"){ba->sale();}BuildingB *bb = new BuildingB;if (bb->mQuity == "低品質"){bb->sale();}
}
#endif//中介類
class Mediator{
public:Mediator(){AbstractBuiding * building = new BuildingA;vBuilding.push_back(building);building = new BuildingB;vBuilding.push_back(building);}~Mediator(){for (vector<AbstractBuiding*>::iterator it = vBuilding.begin(); it != vBuilding.end(); it++){if (*it != NULL){delete *it;}}}//對外提供接口AbstractBuiding *findMyBuilding(string qulity){for (vector<AbstractBuiding *>::iterator it = vBuilding.begin(); it != vBuilding.end(); it++){if ((*it)->getQuality() == qulity){return *it;}}return NULL;}
public:vector<AbstractBuiding*>vBuilding;
};void test02()
{Mediator *mediator = new Mediator;AbstractBuiding*building = mediator->findMyBuilding("高品質");if (building != NULL){building->sale();}else{cout << "沒有符合您條件的樓盤!" << endl;}
}int main(void)
{//test01();test02();system("pause");return 0;
}

就是有個中間商。

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

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

相關文章

source insight 使用技巧

source insight 使用技巧 1 sourceinsight screen font 的默認字體是Verdana的&#xff0c;它是一直變寬字體。在Document style中可以將字體改為定寬的Courier2 document options->auto indent 去掉indent Open Brace和Indent Close Brace的效果: 繼上一段&#xff0c;在…

設計模式----2(簡單工廠模式的概念,簡單工廠模式的實現,簡單工廠模式的優缺點)

簡單工廠模式 簡單工廠模式的概念 簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負 責創建其他類的實例&#xff0c;被創建的實例通常都具有共同的父類。 具體分類 工廠&#xff08;Creator&#xff09;角色 簡單工廠模式的核心&#xff0…

Redis常見問題及其一些重點知識總結

1、什么是 Redis&#xff1f;簡述它的優缺點&#xff1f; Redis 的全稱是&#xff1a;Remote Dictionary.Server&#xff0c;本質上是一個 Key-Value 類型的內存數據庫&#xff0c;很像 memcached&#xff0c;整個數據庫統統加載在內存當中進行操作&#xff0c;定期通過異步操…

shell生成隨機文件名

1 #!/bin/bash 2 # tempfile-name.sh: 臨時文件名產生器 3 4 BASE_STRmcookie # 32-字符的 magic cookie. 5 POS11 # 字符串中隨便的一個位置. 6 LEN5 # 取得 $LEN 長度連續的字符串. 7 8 prefixtemp # 最終的一個臨時文…

設計模式---3(工廠方法模式的概念,工廠方法模式的實現,工廠方法模式和簡單工廠模式比較)

工廠方法模式 概念 工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。 工廠方法模式的意義 定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建&#xff0c;這樣核心類成為一個抽象工廠角色&#xff0c;僅…

設計模式---4(抽象工廠模式的概念,產品組和產品等級的概念,抽象工廠模式的實現)

抽象工廠模式 抽象工廠模式的概念 抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口&#xff0c;使得客戶端在不必指定產品的具體類型的情況下&#xff0c;能夠創建多個產品 族的產品對象。 抽象工廠的角色及其職責 抽象工…

Win32項目關于MessageBox參數的詳細說明

函數功能&#xff1a;該函數創建、顯示、和操作一個消息框。消息框含有應用程序定義的消息和標題&#xff0c;加上預定義圖標與Push&#xff08;下按&#xff09;按鈕的任何組合。 函數原型&#xff1a;int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT…

w3af解析

1. w3af簡介 w3afis a Web Application Attack and Audit Framework.即Web應用攻擊和審計框架。w3af用python編寫&#xff0c;依賴的庫主要有2類&#xff0c;分別如下&#xff1a; <1> Core requirements: Python 2.6 fpconst-0.7.2&#xff1a;用于處理IEEE 754浮點…

1.c++中初始化列表和構造函數初始化的區別是什么?2.類的成員變量的初始化順序是按照聲明順序嗎?

初始化列表和構造函數初始化的區別是什么&#xff1f; 初始化和賦值對內置類型的成員沒有太大的區別&#xff0c;在成員初始化列表和構造函數體內進行&#xff0c;在性能和結果上都是一樣的。只有一些需要注意的事項 初始化列表一般情況如下&#xff1a; Date(int year, int …

設計模式---5(建造者模式的概念及其實現,建造者模式的角色與職責,建造者模式和工廠模式的區別)

建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式&#xff0c;是由 GoF 提出的 23 種設計模式中的一種。 Builder 模式是一種對象創建型模式之一&#xff0c;用來隱藏復合對象的創建過程&#xff0c;它把復合對象的 創建過程加以抽象&#xff0c;通過子…

system阻塞SIGCHLD信號原因

system阻塞SIGCHLD信號原因 標簽&#xff1a; c 2014-11-08 11:58 198人閱讀 評論(0) 收藏 舉報 分類&#xff1a; linux編程&#xff08;1&#xff09; 代碼1&#xff1a;APUE10.18節的system函數源代碼 int system(const char *cmdstring) /* with appropriate signal ha…

設計模式6---(單例模式的概念及其實現(懶漢式和餓漢式),線程安全)

單例模式 單例模式的概念 單例模式是一種對象創建型模式&#xff0c;使用單例模式&#xff0c;可以保證為一個類只生成唯一的實例對象。也就是說&#xff0c;在整個程序空間中&#xff0c;該類只存在一個實例對象。 GoF 對單例模式的定義是&#xff1a;保證一個類、只有一個實…

C語言解析http請求表單內容

[1].[文件] cgi.h ~ 405B 下載(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8] ?123456789101112131415161718192021222324252627#ifndef CGI_H#define CGI_H#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Node{char *…

centos給用戶添加sudo權限

linux給用戶添加sudo權限&#xff1a; 有時候&#xff0c;linux下面運行sudo命令&#xff0c;會提示類似&#xff1a; xxxis not in the sudoers file. This incident will be reported. 這里&#xff0c;xxx是用戶名稱&#xff0c;然后導致無法執行sudo命令&#xff0c;這時候…

php手冊

http://www.php100.com/manual/php/ http://www.kuqin.com/php5_doc/

套接字編程---2(TCP套接字編程的流程,TCP套接字編程中的接口函數,TCP套接字的實現,TCP套接字出現的問題,TCP套接字多進程版本,TCP套接字多線程版本)

TCP模型創建流程圖 TCP套接字編程中的接口 socket 函數 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 這是大多數用來產生socket的協議&#xff0c;使用TCP或UDP來傳輸&…

安全關注

http://yttitan.blog.51cto.com/70821/1576365

Linux中netstat工具詳解

簡介 Netstat 命令用于顯示各種網絡相關信息&#xff0c;如網絡連接&#xff0c;路由表&#xff0c;接口狀態 (Interface Statistics)&#xff0c;masquerade 連接&#xff0c;多播成員 (Multicast Memberships) 等等。 常見參數 -a (all)顯示所有選項&#xff0c;默認不顯示…

網絡基礎 2-1(應用層,HTTP三點注意,HTTP協議格式, 最簡單的HTTP服務器)

應用層 應用層 負責應用程序之間的數據溝通-----協議都是用戶自己定的 自定制協議&#xff1a; 結構化數據傳輸 序列化&#xff1a; 將數據對象以指定的協議&#xff08;數據格式&#xff09;進行可用于持久化存儲或者數據傳輸時的數據組織 例如在分布式的系統中&#xf…

正則表達式 學習

http://regexr.com/ 在線匹配 http://c.biancheng.net/cpp/html/1434.html 查詢網址