老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

首頁>銀行 > 正文

一文講透設計模式(C++版) 全球播報

2023-06-27 23:46:56    出處:阿里開發者

點擊鏈接閱讀原文,獲取更多技術內容:


(資料圖)

本文從設計原則、創建型模式、結構型模式、行為模式四個方向講述C++的設計模式。

作者 | 恒索

來源 | 阿里開發者公眾號

設計原則

單一職責原則

定義:單一職責原則[1],所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于一個的職責。而單一職責原則就是指一個類或者模塊應該 有且只有一個改變的原因。

bad case :IPhone類承擔了協議管理(Dial、HangUp)、數據傳送(Chat)。

good case:

里式替換原則

定義:里氏代換原則[2](Liskov Substitution Principle LSP),任何 基類 可以出現的地方, 子類一定可以出現。

bad case :ToyGun繼承了AbstractGun,但Solider在調用KillEnemy()時會報錯(ToyGun無法KillEnemy),即ToyGun無法完全行使AbstractGun的職責。

good case: AbstractToy中將聲音、形狀都委托給AbstractGun處理。

如果子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關系,采用依賴、聚集、組合等關系代替。

依賴倒置原則

定義:依賴倒置原則[3](Dependence Inversion Principle)是程序要 依賴于抽象接口,不要依賴于具體實現。 簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。

bad case: Driver強依賴于奔馳車。

good case:

接口隔離原則

定義: 接口隔離原則[4],客戶端不應該依賴它不需要的接口。一個類對另一個類的 依賴 應該建立在 最小的接口上 。

bad case: 星探尋找美女的類圖,其中IpettyGirl過于龐大,容納過多可變的因素。

good case: 通過拆分接口,提高了靈活性、可維護性。

迪米特法則

定義:迪米特法則[5](Law of Demeter)又叫作 最少知識原則 (The Least Knowledge Principle),一個類對于其他類知道的越少越好,就是說一個對象應當對其他對象有盡可能少的了解,只和朋友通信,不和陌生人說話。

bad case: Teacher要求GroupLeader清點女生的數量,這里Teacher不應該依賴于Gril。

good case:

開閉原則

定義:開閉原則[6],在面向對象編程領域中,規定“軟件中的對象(類,模塊,函數等等)應該對于 擴展是開放 的,但是對于 修改是封閉 的”。

以一個書店售書類圖為例,當在書店要增加一個打折操作時。

bad case:修改實現類,在IBook上增加一個方法GetOffPrice() good case:通過擴展實現變化,增加一個子類OffNovelBook

創建型模式

工廠方法

定義一個用于創建對象的接口 Product* CreateProduct() ,讓子類決定實例化哪一個類。工廠方法模式讓類的實例化延遲到子類中進行,從而避免了在父類中創建對象時出現類名稱緊耦合的問題,同時提高了代碼的可擴展性和可維護性。(工廠方法的好處就是 解耦 ,當我們修改了具體的類,對調用方而言完全不用修改)

class Product {    // 抽象產品public:  virtual void Method() = 0;};class ConcreteProduct1 : public Product {public:  void Method() { cout << \"ConcreteProduct1\" << endl; }};class ConcreteProduct2 : public Product {public:  void Method() { cout << \"ConcreteProduct2\" << endl; }};class Factory {    // 抽象工廠public:  virtual Product* CreateProduct() = 0;};class ConcreteFactory1 : public Factory {public:  Product* CreateProduct() {return new ConcreteProduct1(); }};class ConcreteFactory2 : public Factory {public:  Product* CreateProduct() {return new ConcreteProduct2(); }};int main () {  Factory *factory1 = new ConcreteFactory1();  Factory *factory2 = new ConcreteFactory2();  Product *product1 = factory1->CreateProduct();  Product *product2 = factory2->CreateProduct();  product1->Method();  product2->Method();}

抽象工廠

為創建一組相關或相互依賴的對象提供一個接口,而且無須指定他們的具體類。(工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是 多個產品等級結構 。抽象工廠模式主要用來實現生產一系列的產品。)

class AbstractProductA { public:  virtual ~AbstractProductA(){};  virtual std::string FunctionA() const = 0;};class ProductA1 : public AbstractProductA { public:  std::string FunctionA() const override { return \"The result of the product A1.\"; }};class ProductA2 : public AbstractProductA {  std::string FunctionA() const override { return \"The result of the product A2.\"; }};class AbstractProductB { public:  virtual ~AbstractProductB(){};  virtual std::string FunctionB() const = 0;};class ProductB1 : public AbstractProductB { public:  std::string FunctionB() const override { return \"The result of the product B1.\"; }};class ProductB2 : public AbstractProductB { public:  std::string FunctionB() const override { return \"The result of the product B2.\"; }};class AbstractFactory { public:  virtual AbstractProductA *CreateProductA() const = 0;  virtual AbstractProductB *CreateProductB() const = 0;};class Factory1 : public AbstractFactory { public:  AbstractProductA *CreateProductA() const override { return new ProductA1(); }  AbstractProductB *CreateProductB() const override { return new ProductB1(); }};class Factory2 : public AbstractFactory { public:  AbstractProductA *CreateProductA() const override { return new ProductA2(); }  AbstractProductB *CreateProductB() const override { return new ProductB2(); }};void Client(const AbstractFactory &factory) {  const AbstractProductA *productA = factory.CreateProductA();  const AbstractProductB *productB = factory.CreateProductB();  std::cout << productA->FunctionA() << \"
\";  std::cout << productB->FunctionB() << \"
\";  delete productA;  delete productB;}int main() {  Factory1 *f1 = new Factory1();  Client(*f1);  delete f1;  Factory2 *f2 = new Factory2();  Client(*f2);  delete f2;  return 0;}

生成器/建造者

將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。(建造者模式關注的是 零件類型 和裝配工藝( 順序 ))

class Product1{public:    std::vectormParts;    void ListParts()const{        std::cout << \"Product parts: \";        for (size_t i=0;imProduct->mParts.push_back(\"PartA1\"); }    void ProducePartB()const override{ this->mProduct->mParts.push_back(\"PartB1\"); }    void ProducePartC()const override{ this->mProduct->mParts.push_back(\"PartC1\"); }    Product1* GetProduct() {         Product1* result= mProduct;        Reset();        return result;     }};class Director {    Builder* mbuilder;public:    void set_builder(Builder* builder){ mbuilder = builder; }    void BuildMinimalViableProduct(){ mbuilder->ProducePartA(); }    void BuildFullFeaturedProduct(){        mbuilder->ProducePartA();        mbuilder->ProducePartB();        mbuilder->ProducePartC();    }};void ClientCode(Director& director){    ConcreteBuilder1* builder = new ConcreteBuilder1();    director.set_builder(builder);    std::cout << \"Standard basic product:
\";     director.BuildMinimalViableProduct();    Product1* p= builder->GetProduct();    p->ListParts();    delete p;    std::cout << \"Standard full featured product:
\";     director.BuildFullFeaturedProduct();    p= builder->GetProduct();    p->ListParts();    delete p;    // Remember, the Builder pattern can be used without a Director class.    std::cout << \"Custom product:
\";    builder->ProducePartA();    builder->ProducePartC();    p=builder->GetProduct();    p->ListParts();    delete p;    delete builder;}int main(){    Director* director= new Director();    ClientCode(*director);    delete director;    return 0;    }

原型

用原型實例指定創建對象的種類,并且通過 拷貝 這些原型創建新的對象。(原型模式實現的是一個Clone 接口,注意是接口,也就是基于 多態的 Clone 虛函數 。)

class Prototype { protected:  string mPrototypeName;  float mPrototypeField;public:  Prototype() {}  Prototype(string prototypeName)      : mPrototypeName(prototypeName) {  }  virtual ~Prototype() {}  virtual Prototype *Clone() const = 0;  virtual void Function(float prototype_field) {    this->mPrototypeField = prototype_field;    std::cout << \"Call Function from \" << mPrototypeName << \" with field : \" << prototype_field << std::endl;  }};class ConcretePrototype1 : public Prototype {private:  float mConcretePrototypeField;public:  ConcretePrototype1(string prototypeName, float concretePrototypeField)      : Prototype(prototypeName), mConcretePrototypeField(concretePrototypeField) {  }  Prototype *Clone() const override {    return new ConcretePrototype1(*this);  }};class ConcretePrototype2 : public Prototype {private:  float mConcretePrototypeField;public:  ConcretePrototype2(string prototypeName, float concretePrototypeField)      : Prototype(prototypeName), mConcretePrototypeField(concretePrototypeField) {  }  Prototype *Clone() const override {    return new ConcretePrototype2(*this);  }};class PrototypeFactory {private:  std::unordered_map>mPrototypes;public:  PrototypeFactory() {    mPrototypes[Type::PROTOTYPE_1] = new ConcretePrototype1(\"PROTOTYPE_1 \", 50.f);    mPrototypes[Type::PROTOTYPE_2] = new ConcretePrototype2(\"PROTOTYPE_2 \", 60.f);  }  ~PrototypeFactory() {    delete mPrototypes[Type::PROTOTYPE_1];    delete mPrototypes[Type::PROTOTYPE_2];  }  Prototype *CreatePrototype(Type type) {    return mPrototypes[type]->Clone();  }};void Client(PrototypeFactory &prototypeFactory) {  std::cout << \"Let"s create a Prototype 1
\";  Prototype *prototype = prototypeFactory.CreatePrototype(Type::PROTOTYPE_1);  prototype->Function(90);  delete prototype;  std::cout << \"Let"s create a Prototype 2 
\";  prototype = prototypeFactory.CreatePrototype(Type::PROTOTYPE_2);  prototype->Function(10);  delete prototype;}int main() {  PrototypeFactory *prototypeFactory = new PrototypeFactory();  Client(*prototypeFactory);  delete prototypeFactory;  return 0;}

單例

單例模式是指在整個系統生命周期內,保證 一個類只能產生一個實例 ,確保該類的 唯一性 。

剩余60%,完整內容請點擊下方鏈接查看:

阿里云開發者社區,千萬開發者的選擇。百萬精品技術內容、千節免費系統課程、豐富的體驗場景、活躍的社群活動、行業專家分享交流,盡在:

關鍵詞:

消費
產業
石家莊學院教師團隊獲外研社“教學之星”大賽全國復賽一等獎|世界今日訊 近日,在2023年外研社“教學之星”大賽中,石家莊學院教師呂汝茵、武高
全球快資訊丨南亞新材跌8.5% 上市即巔峰超募8.7億光大證券保薦 南亞新材跌8 5%上市即巔峰超募8 7億光大證券保薦
《都市魅影》游戲找小孩 小孩在哪里 都市魅影大叔的孩子在他的家中。可以得知這是一個問句,而且是關于都市
焦點短訊!甬金股份: 關于子公司完成工商變更登記并換發營業執照的公告 甬金股份:關于子公司完成工商變更登記并換發營業執照的公告
基金
老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

      国产精品久久久久久久久快鸭| 日韩av中文在线观看| 青青草国产成人99久久| 成人h动漫精品| 亚洲欧美国产高清| 欧美人伦禁忌dvd放荡欲情| 欧美国产日韩a欧美在线观看| 亚洲国产日日夜夜| 国产.欧美.日韩| 最近中文字幕一区二区三区| 欧美亚洲一区二区在线| 欧美国产精品专区| 免费成人美女在线观看| 久久久一区二区三区| 色综合天天综合狠狠| 亚洲国产高清不卡| 老司机精品视频线观看86| 久久久777精品电影网影网| 91国产福利在线| 国产欧美日本一区视频| 麻豆国产精品一区二区三区 | 免费成人美女在线观看| 久久久国产一区二区三区四区小说| 亚洲国产cao| 国产日韩精品一区二区三区在线| 日av在线不卡| 国产精品视频在线看| 欧美日韩精品系列| 亚洲免费大片在线观看| 播五月开心婷婷综合| 亚瑟在线精品视频| 国产精品每日更新| 国产精品一级二级三级| 亚洲一二三四久久| 中文字幕第一区综合| 国产一区二区精品久久99| 亚洲免费观看高清在线观看| 日韩欧美一二三区| 日本一不卡视频| 国产精品免费视频一区| 日韩午夜激情av| 奇米色一区二区三区四区| 日本一区二区成人在线| 欧美zozozo| 久草这里只有精品视频| 亚洲欧美日韩小说| 国产日韩精品视频一区| 国产乱码一区二区三区| 亚洲国产综合色| 中文字幕在线不卡国产视频| 不卡影院免费观看| 欧美日韩你懂的| 亚洲成人黄色影院| 国产精品另类一区| 久久天堂av综合合色蜜桃网| 激情丁香综合五月| 五月天激情小说综合| 1024成人网色www| 91丨porny丨户外露出| 欧美日韩一区在线观看| 婷婷亚洲久悠悠色悠在线播放| 国产精品网站在线| 久久亚洲影视婷婷| 国产 日韩 欧美大片| 欧美日韩一区 二区 三区 久久精品| 亚洲资源在线观看| 国产精品成人在线观看| 国产午夜亚洲精品羞羞网站| 高清av一区二区| 欧美三级欧美一级| 男女男精品视频| 一个色妞综合视频在线观看| 亚洲欧美一区二区视频| 国产亚洲欧美一级| 欧美精品一区二区三区很污很色的 | 亚洲人成精品久久久久| www精品美女久久久tv| 日韩精品综合一本久道在线视频| 精品一区二区免费视频| 色又黄又爽网站www久久| 亚洲国产一区二区视频| 亚洲女性喷水在线观看一区| 亚洲天堂免费看| 亚洲国产成人自拍| 国产精品视频yy9299一区| 91丨porny丨在线| 久久在线观看免费| 91亚洲午夜精品久久久久久| 欧美一级淫片007| 国产成人精品亚洲午夜麻豆| 欧美猛男超大videosgay| 久久成人免费日本黄色| 欧美在线小视频| 青青青爽久久午夜综合久久午夜| 天天色综合成人网| 日韩精品亚洲一区| 91黄色在线观看| 久热成人在线视频| 在线观看国产一区二区| 乱一区二区av| 欧美日韩国产精品自在自线| 另类小说综合欧美亚洲| 欧美三级电影网站| 国产一区二区三区电影在线观看| 91久久免费观看| 免费xxxx性欧美18vr| 在线免费不卡电影| 国产一区免费电影| 欧美一区二区三区视频在线观看| 国产成人午夜精品5599| 欧美成人艳星乳罩| 久久在线免费观看| 欧美激情中文字幕一区二区| 中文字幕欧美国产| 一区二区三区电影在线播| 亚洲美女免费视频| 五月激情综合网| 日本道色综合久久| 国产成都精品91一区二区三| 日韩美女视频在线| 91蜜桃在线免费视频| 中文文精品字幕一区二区| 国产精品美女一区二区三区| 一区二区高清在线| 日本道精品一区二区三区| 国产精品资源在线看| 精品国产乱码久久久久久1区2区| 久久久久久夜精品精品免费| 亚洲欧美在线aaa| 亚洲成a天堂v人片| 国产一区二区三区香蕉| www久久精品| 国产精品传媒入口麻豆| 日韩中文字幕一区二区三区| 欧美日本韩国一区二区三区视频| av电影在线观看一区| 国产精品久久久久久久午夜片| 亚洲精品乱码久久久久久久久| 日本不卡一区二区三区| 91麻豆精品国产| 国产午夜亚洲精品理论片色戒| 一区二区三区小说| 在线一区二区三区四区| 成人高清视频免费观看| 中文字幕一区三区| 亚洲成人1区2区| 粉嫩13p一区二区三区| 国产精品美女久久久久久久| 亚洲综合网站在线观看| 国产美女在线精品| 国产亚洲制服色| 亚洲精品久久7777| 国内一区二区在线| 国产欧美综合色| 亚洲成人www| 不卡一卡二卡三乱码免费网站 | 欧美极品美女视频| 亚洲第一在线综合网站| 8v天堂国产在线一区二区| 久久久美女毛片| 午夜电影网一区| 91精品国产综合久久久久久久| 国产亲近乱来精品视频| 午夜在线成人av| 制服丝袜亚洲精品中文字幕| 国产农村妇女毛片精品久久麻豆| 丝袜国产日韩另类美女| 日韩亚洲国产中文字幕欧美| 亚洲视频免费观看| 国产在线不卡一区| 中文字幕五月欧美| 色94色欧美sute亚洲线路一ni | 国内精品在线播放| 国产欧美中文在线| 婷婷久久综合九色国产成人| 99精品欧美一区二区三区小说 | 五月天中文字幕一区二区| 风间由美一区二区三区在线观看 | 国产精品久久久久久久蜜臀 | 国产欧美一区二区精品仙草咪| 夜夜亚洲天天久久| 国产成人av影院| 亚洲精品你懂的| 91精品免费在线| 亚洲欧美日韩国产综合| 国产精品亚洲第一区在线暖暖韩国 | 国产精品福利一区| 经典三级视频一区| 国产精品久久网站| 欧美人xxxx| 亚洲欧美日本在线| 成人精品免费视频| 亚洲第一福利一区| 久久久精品黄色| 在线观看欧美精品| 国产精品免费视频一区| 国产在线视频一区二区| 一区二区三区蜜桃| 欧美大片在线观看| 色哟哟在线观看一区二区三区|