日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式之适配器模式(Adapter)摘录

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之适配器模式(Adapter)摘录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

23種GOF設計模式一般分為三大類:創建型模式、結構型模式、行為模式。

創建型模式抽象了實例化過程,它們幫助一個系統獨立于如何創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例化的類,而一個對象創建型模式將實例化委托給另一個對象。創建型模式有兩個不斷出現的主旋律。第一,它們都將關于該系統使用哪些具體的類的信息封裝起來。第二,它們隱藏了這些類的實例是如何被創建和放在一起的。整個系統關于這些對象所知道的是由抽象類所定義的接口。因此,創建型模式在什么被創建,誰創建它,它是怎樣被創建的,以及何時創建這些方面給予了很大的靈活性。它們允許用結構和功能差別很大的“產品”對象配置一個系統。配置可以是靜態的(即在編譯時指定),也可以是動態的(在運行時)。

結構型模式涉及到如何組合類和對象以獲得更大的結構。結構型類模式采用繼承機制來組合接口或實現。結構型對象模式不是對接口和實現進行組合,而是描述了如何對一些對象進行組合,從而實現新功能的一些方法。因為可以在運行時刻改變對象組合關系,所以對象組合方式具有更大的靈活性,而這種機制用靜態類組合是不可能實現的。

行為模式涉及到算法和對象間職責的分配。行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運行時難以跟蹤的復雜的控制流。它們將用戶的注意力從控制流轉移到對象間的聯系方式上來。行為類模式使用繼承機制在類間分派行為。行為對象模式使用對象復合而不是繼承。一些行為對象模式描述了一組對等的對象怎樣相互協作以完成其中任一個對象都無法單獨完成的任務。

創建型模式包括:1、FactoryMethod(工廠方法模式);2、Abstract Factory(抽象工廠模式);3、Singleton(單例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).

結構型模式包括:6、Bridge(橋接模式);7、Adapter(適配器模式);8、Decorator(裝飾模式);9、Composite(組合模式);10、Flyweight(享元模式);11、Facade(外觀模式);12、Proxy(代理模式).

行為模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(狀態模式);16、Observer(觀察者模式);17、Memento(備忘錄模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(訪問者模式);21、Chain of Responsibility(責任鏈模式);22、Iterator(迭代器模式);23、Interpreter(解釋器模式).

Factory Method:定義一個用于創建對象的接口,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。

Abstract Factory:提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。

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

Builder:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

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

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

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

Decorator:動態地給一個對象添加一些額外的職責。就擴展功能而言, Decorator模式比生成子類方式更為靈活。

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

Flyweight:運用共享技術有效地支持大量細粒度的對象。

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

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

Template Method:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

Strategy:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。

State:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它所屬的類。

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

Memento:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到保存的狀態。

Mediator:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

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

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

Chain of Responsibility:為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。

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

Interpreter:給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。

???????? Adapter:(1)、意圖:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

???????? (2)、適用性:A、想使用一個已經存在的類,而它的接口不符合你的需求;B、想創建一個可以復用的類,該類可以與其它不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作;C、(僅適用于對象Adapter)想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。

???????? (3)、注意事項:類適配器使用多重繼承對一個接口與另一個接口進行匹配。對象適配器依賴于對象組合。類適配器和對象適配器有不同的權衡。類適配器:A、用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有它的子類時,類Adapter將不能勝任工作;B、使得Adapter可以重新定義Adaptee的部分行為,因為Adapter是Adaptee的一個子類;C、僅僅引入了一個對象,并不需要額外的指針以間接得到adaptee.對象適配器則:A、允許一個Adapter與多個Adaptee----即Adaptee本身以及它的所有子類(如果有子類的話)同時工作。Adapter也可以一次給所有的Adaptee添加功能;B、使得重定義Adaptee的行為比較困難。這就需要生成Adaptee的子類并且使得Adapter引用這個子類而不是引用Adaptee本身。

(4)、使用Adapter模式時需要考慮的其它一些因素有:A、Adapter的匹配程度:對Adaptee的接口與Target的接口進行匹配的工作量各個Adapter可能不一樣。工作范圍可能是,從簡單的接口轉換到支持完全不同的操作集合。Adapter的工作量取決于Target接口與Adaptee接口的相似程度。B、可插入的Adapter:當其它的類使用一個類時,如果所需的假定條件越少,這個類就更具可復用性。如果將接口匹配構建為一個類,就不需要假定對其它的類可見的是一個相同的接口。也就是說,接口匹配使得我們可以將自己的類加入到一些現有的系統中去,而這些系統對這個類的接口可能會有所不同。

???????? (5)、使用C++實現適配器類:在使用C++實現適配器類時,Adapter類應該采用公共方式繼承Target類,并且用私有方式繼承Adaptee類。因此,Adapter類應該是Target的子類型,但不是Adaptee的子類型。

???????? (6)、相關模式:Bridge的結構與對象適配器類似,但是Bridge模式的出發點不同:Bridge目的是將接口部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。而Adapter則意味著改變一個已有對象的接口。Decorator增強了其它對象的功能而同時又不改變它的接口。因此decorator對應用程序的透明性比適配器要好。結果是decorator支持遞歸組合,而純粹使用適配器是不可能實現這一點的。Proxy在不改變它的接口的條件下,為另一個對象定義了一個代理。

???????? 雙方都不適合修改的時候,可以考慮使用適配器模式。

???????? 類模式的Adapter采用繼承的方式復用Adaptee的接口,而在對象模式的Adapter中則采用組合的方式實現Adaptee的復用。


示例代碼1:

#include <iostream>
using namespace std;class Target
{
public:virtual void Request(){cout<<"普通的請求"<<endl;}
};class Adaptee
{
public:void SpecificalRequest(){cout<<"特殊的請求"<<endl;}
};class Adapter : public Target
{
private:Adaptee* ada;
public:virtual void Request(){ada->SpecificalRequest();Target::Request();}Adapter(){ada = new Adaptee();}~Adapter(){delete ada;}
};//客戶端
int main()
{Adapter* ada = new Adapter();ada->Request();delete ada;/*result特殊的請求普通的請求*/return 0;
}

示例代碼2:

#include <iostream>
#include <string>
using namespace std;class Player
{
protected:string name;
public:Player(string strName) {name = strName;}virtual void Attack() = 0;virtual void Defense() = 0;
};class Forwards : public Player
{
public:Forwards(string strName) : Player(strName) {}
public:virtual void Attack(){cout<<name<<"前鋒進攻"<<endl;}virtual void Defense(){cout<<name<<"前鋒防守"<<endl;}
};class Center : public Player
{
public:Center(string strName) : Player(strName) {}
public:virtual void Attack(){cout<<name<<"中場進攻"<<endl;}virtual void Defense(){cout<<name<<"中場防守"<<endl;}
};//為中場翻譯
class TransLater : public Player
{
private:Center* player;
public:TransLater(string strName) : Player(strName){player = new Center(strName);}virtual void Attack(){player->Attack();}virtual void Defense(){player->Defense();}
};//客戶端
int main()
{Player* p = new TransLater("小李");p->Attack();/*result小李中場進攻*/return 0;
}

示例代碼3:類模式

Adapter.h

#ifndef _ADAPTER_H_
#define _ADAPTER_H_class Target
{
public:Target();virtual ~Target();virtual void Request();
protected:
private:
};class Adaptee
{
public:Adaptee();~Adaptee();void SpecificRequest();
protected:
private:
};class Adapter : public Target, private Adaptee
{
public:Adapter();~Adapter();void Request();
protected:
private:
};#endif//~_ADAPTER_H_

Adapter.cpp:

#include "Adapter.h"
#include <iostream>Target::Target()
{}Target::~Target()
{}void Target::Request()
{std::cout<<"Target::Request"<<std::endl;
}Adaptee::Adaptee()
{}Adaptee::~Adaptee()
{}void Adaptee::SpecificRequest()
{std::cout<<"Adaptee::SpecificRequest"<<std::endl;
}Adapter::Adapter()
{}Adapter::~Adapter()
{}void Adapter::Request()
{this->SpecificRequest();
}

main.cpp:

#include "Adapter.h"
#include <iostream>
using namespace std;int main()
{//Adapter* adt = new Adapter();Target* adt = new Adapter();adt->Request();/*resultAdaptee::SpecificRequest*/return 0;
}

示例代碼4:對象模式

Adapter.h:

#ifndef _ADAPTER_H_
#define _ADAPTER_H_class Target
{
public:Target();virtual ~Target();virtual void Request();protected:
private:
};class Adaptee
{
public:Adaptee();~Adaptee();void SpecificRequest();protected:
private:
};class Adapter : public Target
{
public:Adapter(Adaptee* ade);~Adapter();void Request();
protected:
private:Adaptee* _ade;
};#endif//~_ADAPTER_H_

Adapter.cpp:

#include "Adapter.h"
#include <iostream>Target::Target()
{}Target::~Target()
{}void Target::Request()
{std::cout<<"Target::Request"<<std::endl;
}Adaptee::Adaptee()
{}Adaptee::~Adaptee()
{}void Adaptee::SpecificRequest()
{std::cout<<"Adaptee::SpecificRequest"<<std::endl;
}Adapter::Adapter(Adaptee* ade)
{this->_ade = ade;
}Adapter::~Adapter()
{}void Adapter::Request()
{_ade->SpecificRequest();
}

main.cpp:

#include "Adapter.h"
#include <iostream>
using namespace std;int main()
{Adaptee* ade = new Adaptee;Target* adt = new Adapter(ade);adt->Request();/*resultAdaptee::SpecificRequest*/return 0;
}

適配器模式結構圖:


參考文獻:

1、《大話設計模式C++》

2、《設計模式精解----GoF23種設計模式解析》

3、《設計模式----可復用面向對象軟件的基礎》



總結

以上是生活随笔為你收集整理的设计模式之适配器模式(Adapter)摘录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:设计模式之适配器模式(Adapter)摘录