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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

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

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

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:給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。

???????? Decorator:(1)、意圖:動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。

???????? (2)、適用性:在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責;處理那些可以撤消的職責;當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

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

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

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

???????? 動態地給一個對象添加一些額外的職責(不重要的功能,只是偶然一次要執行),就增加功能來說,裝飾模式比生成子類更為靈活。建造過程不穩定,按正確的順序串聯起來進行控制。

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

???????? Decorator提供了一種給類增加職責的方法,不是通過繼承實現的,而是通過組合。

示例代碼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;
}

裝飾模式結構圖:


參考文獻:

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

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

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


總結

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

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

歡迎分享!

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

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