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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式之装饰模式(Decorator)摘录

發(fā)布時(shí)間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之装饰模式(Decorator)摘录 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

23種GOF設(shè)計(jì)模式一般分為三大類:創(chuàng)建型模式、結(jié)構(gòu)型模式、行為模式。

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

結(jié)構(gòu)型模式涉及到如何組合類和對(duì)象以獲得更大的結(jié)構(gòu)。結(jié)構(gòu)型類模式采用繼承機(jī)制來組合接口或?qū)崿F(xiàn)。結(jié)構(gòu)型對(duì)象模式不是對(duì)接口和實(shí)現(xiàn)進(jìn)行組合,而是描述了如何對(duì)一些對(duì)象進(jìn)行組合,從而實(shí)現(xiàn)新功能的一些方法。因?yàn)榭梢栽谶\(yùn)行時(shí)刻改變對(duì)象組合關(guān)系,所以對(duì)象組合方式具有更大的靈活性,而這種機(jī)制用靜態(tài)類組合是不可能實(shí)現(xiàn)的。

行為模式涉及到算法和對(duì)象間職責(zé)的分配。行為模式不僅描述對(duì)象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。它們將用戶的注意力從控制流轉(zhuǎn)移到對(duì)象間的聯(lián)系方式上來。行為類模式使用繼承機(jī)制在類間分派行為。行為對(duì)象模式使用對(duì)象復(fù)合而不是繼承。一些行為對(duì)象模式描述了一組對(duì)等的對(duì)象怎樣相互協(xié)作以完成其中任一個(gè)對(duì)象都無法單獨(dú)完成的任務(wù)。

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

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

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

Factory Method:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定將哪一個(gè)類實(shí)例化。Factory Method使一個(gè)類的實(shí)例化延遲到其子類。

Abstract Factory:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類。

Singleton:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。

Builder:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

Prototype:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這個(gè)原型來創(chuàng)建新的對(duì)象。

Bridge:將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。

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

Decorator:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就擴(kuò)展功能而言, Decorator模式比生成子類方式更為靈活。

Composite:將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得客戶對(duì)單個(gè)對(duì)象和復(fù)合對(duì)象的使用具有一致性。

Flyweight:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

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

Proxy:為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問。

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

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

State:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來似乎修改了它所屬的類。

Observer:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新。

Memento:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到保存的狀態(tài)。

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

Command:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。

Visitor:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

Chain of Responsibility:為解除請(qǐng)求的發(fā)送者和接收者之間耦合,而使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它。

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

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

???????? Decorator:(1)、意圖:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。

???????? (2)、適用性:在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé);處理那些可以撤消的職責(zé);當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。

???????? (3)、優(yōu)缺點(diǎn):A、比靜態(tài)繼承更靈活:與對(duì)象的靜態(tài)繼承(多重繼承)相比,Decorator模式提供了更具靈活的向?qū)ο筇砑勇氊?zé)的方式。可以用添加和分離的方法,用裝飾在運(yùn)行時(shí)刻增加和刪除職責(zé)。相比之下,繼承機(jī)制要求為每個(gè)添加的職責(zé)創(chuàng)建一個(gè)新的子類。這會(huì)產(chǎn)生許多新的類,并且會(huì)增加系統(tǒng)的復(fù)雜度。此外,為一個(gè)特定的Component類提供多個(gè)不同的Decorator類,這就使得你可以對(duì)一些職責(zé)進(jìn)行混合和匹配。使用Decorator模式可以很容易地重復(fù)添加一個(gè)特性。B、避免在層次結(jié)構(gòu)高層的類有太多的特征:Decorator模式提供了一種”即用即付”的方法來添加職責(zé)。它并不試圖在一個(gè)復(fù)雜的可定制的類中支持所有可預(yù)見的特征,相反,你可以定義一個(gè)簡單的類,并且用Decorator類給它逐漸地添加功能。可以從簡單的部件組合出復(fù)雜的功能(甚至是不可預(yù)知的擴(kuò)展)的類而獨(dú)立的定義新類型的Decorator。擴(kuò)展一個(gè)復(fù)雜類的時(shí)候,很可能會(huì)暴露與添加的職責(zé)無關(guān)的細(xì)節(jié)。C、Decorator與它的Component不一樣:Decorator是一個(gè)透明的包裝。如果我們從對(duì)象標(biāo)識(shí)的觀點(diǎn)出發(fā),一個(gè)被裝飾了的組件與這個(gè)組件是有差別的,因此,使用裝飾時(shí)不應(yīng)該依賴對(duì)象標(biāo)識(shí)。D、有許多小對(duì)象:采用Decorator模式進(jìn)行系統(tǒng)設(shè)計(jì)往往會(huì)產(chǎn)生許多看上去類似的小對(duì)象,這些對(duì)象僅僅在他們相互連接的方式上有所不同,而不是它們的類或是它們的屬性值有所不同。盡管對(duì)于那些了解這些系統(tǒng)的人來說,很容易對(duì)它們進(jìn)行定制,但是很難學(xué)習(xí)這些系統(tǒng),排錯(cuò)也很困難。

???????? (4)、注意事項(xiàng):A、接口的一致性:裝飾對(duì)象的接口必須與它所裝飾的Component的接口是一致的,因此,所有的ConcreteDecorator類必須有一個(gè)公共的父類(至少在C++中如此)。B、省略抽象的Decorator類:當(dāng)你僅需要添加一個(gè)職責(zé)時(shí),沒有必要定義抽象的Decorator類。你常常需要處理現(xiàn)存的類層次結(jié)構(gòu)而不是設(shè)計(jì)一個(gè)新系統(tǒng),這是你可以把Decorator向Component轉(zhuǎn)發(fā)請(qǐng)求的職責(zé)合并到ConcreteDecorator中。C、保持Component類的簡單性:為了保證接口的一致性,組件和裝飾必須有一個(gè)公共的Component父類。因此保持這個(gè)類的簡單性是很重要的;即,它應(yīng)集中于定義接口而不是存儲(chǔ)數(shù)據(jù)。對(duì)數(shù)據(jù)表示的定義應(yīng)延遲到子類中,否則Component類會(huì)變得過于復(fù)雜和龐大,因而難以大量使用。賦予Component太多的功能也使得,具體的子類有一些它們并不需要的功能的可能性大大增加。D、改變對(duì)象外殼與改變對(duì)象內(nèi)核:我們可以將Decorator看作一個(gè)對(duì)象的外殼,它可以改變這個(gè)對(duì)象的行為。另外一種方法是改變對(duì)象的內(nèi)核。例如,Strategy模式就是一個(gè)用于改變內(nèi)核的很好的模式。當(dāng)Component類原本就很龐大時(shí),使用Decorator模式代價(jià)太高,Strategy模式相對(duì)更好一些。在Strategy模式中,組件將它的一些行為轉(zhuǎn)發(fā)給一個(gè)獨(dú)立的策略對(duì)象,我們可以替換strategy對(duì)象,從而改變或擴(kuò)充組件的功能。

???????? (5)、相關(guān)模式:A、Adapter模式:Decorator模式不同于Adapter模式,因?yàn)檠b飾僅改變對(duì)象的職責(zé)而不改變它的接口;而適配器將給對(duì)象一個(gè)全新的接口;B、Composite模式:可以將裝飾視為一個(gè)退化的、僅有一個(gè)組件的組合。然而,裝飾僅給對(duì)象添加一些額外的職責(zé)----它的目的不在于對(duì)象聚集;C、Strategy模式:用一個(gè)裝飾你可以改變對(duì)象的外表;而Strategy模式使得你可以改變對(duì)象的內(nèi)核。這是改變對(duì)象的兩種途徑。

???????? 動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)(不重要的功能,只是偶然一次要執(zhí)行),就增加功能來說,裝飾模式比生成子類更為靈活。建造過程不穩(wěn)定,按正確的順序串聯(lián)起來進(jìn)行控制。

???????? 當(dāng)你向舊的類中添加新代碼時(shí),一般是為了添加核心職責(zé)或主要行為。而當(dāng)需要加入的僅僅是一些特定情況下才會(huì)執(zhí)行的特定的功能時(shí)(簡單點(diǎn)就是不是核心應(yīng)用的功能),就會(huì)增加類的復(fù)雜度。裝飾模式就是把要添加的附加功能分別放在單獨(dú)的類中,并讓這個(gè)類包含它要裝飾的對(duì)象,當(dāng)需要執(zhí)行時(shí),客戶端就可以有選擇地、按順序地使用裝飾功能包裝對(duì)象。

???????? Decorator提供了一種給類增加職責(zé)的方法,不是通過繼承實(shí)現(xiàn)的,而是通過組合。

示例代碼1:

#include <string>
#include <iostream>
using namespace std;//人
class Person
{
private:string m_strName;
public:Person(string strName){m_strName = strName;}Person() {}virtual void Show(){cout<<"裝扮的是:"<<m_strName<<endl;}
};//裝飾類
class Finery : public Person
{
protected:Person* m_component;
public:void Decorate(Person* component){m_component = component;}virtual void Show(){m_component->Show();}
};//T恤
class TShirts : public Finery
{
public:virtual void Show(){cout<<"T Shirts"<<endl;m_component->Show();}
};//褲子
class BigTrouser : public Finery
{
public:virtual void Show(){cout<<"Big Trouser"<<endl;m_component->Show();}
};//客戶端
int main()
{Person* p = new Person("小李");BigTrouser* bt = new BigTrouser();TShirts* ts = new TShirts();bt->Decorate(p);ts->Decorate(bt);ts->Show();/*result:T ShirtsBig Trouser裝扮的是:小李*/return 0;
}

示例代碼2:

Decorator.h:

#ifndef _DECORATOR_H_
#define _DECORATOR_H_class Component
{
public:virtual ~Component();virtual void Operation();
protected:Component();
private:
};class ConcreteComponent : public Component
{
public:ConcreteComponent();~ConcreteComponent();void Operation();
protected:
private:
};class Decorator : public Component
{
public:Decorator(Component* com);virtual ~Decorator();void Operation();
protected:Component* _com;
private:
};class ConcreteDecorator : public Decorator
{
public:ConcreteDecorator(Component* com);~ConcreteDecorator();void Operation();void AddedBehavior();
protected:
private:
};#endif//~_DECORATOR_H_

Decorator.cpp:

#include "Decorator.h"
#include <iostream>Component::Component()
{}Component::~Component()
{}void Component::Operation()
{}ConcreteComponent::ConcreteComponent()
{}ConcreteComponent::~ConcreteComponent()
{}void ConcreteComponent::Operation()
{std::cout<<"ConcreteComponent operation ..."<<std::endl;
}Decorator::Decorator(Component* com)
{this->_com = com;
}Decorator::~Decorator()
{delete _com;
}void Decorator::Operation()
{}ConcreteDecorator::ConcreteDecorator(Component* com) : Decorator(com)
{}ConcreteDecorator::~ConcreteDecorator()
{}void ConcreteDecorator::AddedBehavior()
{std::cout<<"ConcreteDecorator::AddedBehavior ..."<<std::endl;
}void ConcreteDecorator::Operation()
{_com->Operation();this->AddedBehavior();
}

main.cpp:

#include "Decorator.h"
#include <iostream>
using namespace std;int main()
{Component* com = new ConcreteComponent();Decorator* dec = new ConcreteDecorator(com);dec->Operation();delete dec;/*resultConcreteComponent operation ...ConcreteDecorator::AddedBehavior*/return 0;
}

裝飾模式結(jié)構(gòu)圖:


參考文獻(xiàn):

1、《大話設(shè)計(jì)模式C++》

2、《設(shè)計(jì)模式精解----GoF23種設(shè)計(jì)模式解析》

3、《設(shè)計(jì)模式----可復(fù)用面向?qū)ο筌浖幕A(chǔ)》


總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請(qǐng)說明來源于"生活随笔",并保留原作者的名字。

本文地址:设计模式之装饰模式(Decorator)摘录