1、上篇回顧
經過上篇的簡單描述,咱們知道了橋接模式主要是爲了解決,一個對象的多個維度的變化因素的變化太快,難以控制的問題,咱們經過將每一個維度的變化因素進行抽象, 而後咱們的對象只要依賴於抽象便可,具體的實現調用咱們不關心,經過對象組合的方式,咱們就能組合出咱們想要的對象。無疑這是一種很是靈活的也是知足設計模式的原則的,抽象和實現分離,使他們各自發生變化都不受對方的影響。並且咱們也講述了,使用橋接模式的幾個典型的場景,如今咱們的實際項目中就有這樣的問題,我也是在項目的使用過程當中加深對橋接模式的理解的,橋接模式爲系統在多個維度的變化的適應性方面提供了很好的參考,特別適合底層框架的開發過程當中使用,能夠適應不一樣變化因素的改變。上篇橋接模式放出後,我也獲得了很多朋友的反饋,很感謝你們,這裏特別的感謝一個名叫「蕭蕭」的朋友,他指出了我在文章中給出的例子有些不妥之處,我本篇將會對上篇中給出的例子,從給出符合橋接模式的實現,這裏對你們say sorry !javascript
上篇中的實現:
public
interface
IORM
{
ISave Save
{
get
;
set
;
}
IDelete Delete
{
get
;
set
;
}
ICreate Create
{
get
;
set
;
}
ICache Cache
{
get
;
set
;
}
IQuery Query
{
get
;
set
;
}
void
Test();
}
咱們在這個接口的定義中並無體現橋接模式中的變化因素的抽象的概念,咱們修改成以下形式:
public
interface
IORM
{
ISave Save
{
get
;
set
;
}
IDelete Delete
{
get
;
set
;
}
ICreate Create
{
get
;
set
;
}
void
Test();
}
public
interface
ICache
{
object
Cache(
object
o);
}
public
interface
IQuery
{
object
Query(
string
condition);
}
具體的緩存服務與查詢服務的實現:
public
class
Cache : ICache
{
public
object
Cache(
object
o){
return
o;
}
}
public
class
Query: IQuery
{
public
object
Query(
string
condition){
return
GetList(condition);
}
}
具體的ORM實現代碼以下:
public
class
ORM : IORM
{
private
IQuery query
=
new
Query();
private
ICache cache
=
new
Cache();
public
ORM(IQuery query,ICache cache)
{
this
.query
=
query;
this
.cache
=
cache;
}
public
ISave Save
{
get
{
throw
new
NotImplementedException();
}
set
{
throw
new
NotImplementedException();
}
}
public
IDelete Delete
{
get
{
throw
new
NotImplementedException();
}
set
{
throw
new
NotImplementedException();
}
}
public
ICreate Create
{
get
{
throw
new
NotImplementedException();
}
set
{
throw
new
NotImplementedException();
}
}
public
void
Test()
{
///
測試緩存對象!
this
.cache.Cache(
new
object
());
}
}
對於以前按照我給的思路的方式,請你們糾正下思路,我這裏對你們形成的誤解,表示抱歉,由於我舉例子的時候,表述的和咱們本文的初衷有些誤差,但願你們見諒,請你們繼續提出寶貴意見和建議。java
2、摘要
本篇將會開始講述結構型模式中的頗有技巧性的模式之一-裝飾模式,咱們理解的裝飾就是給類穿個衣服,或者裝扮一下,讓某個類具備一個新的特性或者新的職責。咱們在應對對於經過類的繼承來實現類擴展功能時候的膨脹的速度過快的問題,我想這個也是咱們上一篇講述的橋接模式中提到的一些問題,不過裝飾模式和橋接模式的側重點稍微不一樣。裝飾模式更側重的是某個類型的功能常常的動態的增長的狀況。那麼若是咱們經過繼承的方式來實現,那麼將會是噩夢。繼承復繼承,繼承何其多,然而經過裝飾模式,咱們就能很優雅的爲某個類型添加新的職責。咱們也知道,因爲C#不支持多繼承,咱們只能爲某個類型添加新增功能的時候,咱們只能單繼承+多實現接口的形式來爲類型添加新的功能。而裝飾模式能夠很優雅的解決這樣的問題。web
裝飾模式的主要目的就是:動態的爲某個類型添加新的職責。設計模式
咱們來看看裝飾模式的過程吧:
緩存
咱們將本身開發一個簡單的播放器,咱們經過第一次裝飾能夠爲播放器增長播放音樂的功能,具體包括播放全部的音頻格式文件,經過第二次裝飾,咱們能夠爲這個播放器添加播放視頻格式文件的功能,這時候,若是咱們想要一個萬能的播放器,那麼咱們將經過2次裝飾來完成這個播放器的類型職責的添加。架構
3、本文大綱
a、上篇回顧。框架
b、摘要。ide
c、本文大綱。post
d、裝飾模式的特色及使用場景。測試
e、裝飾模式的經典實現。
f、裝飾模式的其餘方案。
g、裝飾模式使用總結。
4、裝飾模式的特色及使用場景
4.一、裝飾模式的特色
裝飾模式:裝飾模式主要是解決了,咱們以動態的,透明的形式爲某個類型添加一個新的職責,客戶程序能夠不知道咱們具體添加的功能職責,而客戶程序只是根據對象提供的方法進行調用便可。而具體職責操做留給裝飾對象去完成。
咱們這裏給出裝飾模式的經典模式的類圖: 
咱們這裏對這個經典結構進行稍微的說明:咱們這裏結合咱們上面的播放器來講
一、對於Compnent,咱們定義一個IPlayer這樣的接口,咱們接口中定義方法,Play()方法。
二、而後咱們把要裝飾這個播放器的裝飾類型進行抽象,抽象出接口IDecorator接口。這個便可繼承自IPlayer接口。
三、接着,咱們定義一個簡單的播放器對象,實現這個IPlayer接口。
四、咱們實現播放音樂和視頻文件的裝飾類型的實現。
五、咱們將簡單的播放器對象,經過裝飾對象進行裝飾,爲這個簡單播放器套上一層一層的外殼,使其具備播放音樂和視頻的功能。
4.二、裝飾模式的使用場景
一、當咱們須要爲某個現有的對象,動態的增長一個新的功能或職責時,能夠考慮使用裝飾模式。
二、適應於某個對象的職責常常發生變化或者常常須要動態的增長職責,避免由於這種爲了適應這樣的變化,而增長繼承子類擴展的方式,由於這種方式爲 形成,子類膨脹的速度過快,難以控制。
5、裝飾模式的經典實現
通過上面的簡單描述,我想你們很想知道裝飾模式的經典實現方案吧!咱們來結合播放器的實例來分析實現,下面給出核心代碼:
///
///
簡單播放器的統一接口
///
public
interface
IPlayer
{
void
Play();
}
///
///
播放器的普通實現類
///
public
class
Player : IPlayer
{
#region
IPlayer 成員
public
void
Play()
{
throw
new
NotImplementedException();
}
#endregion
}
//
//
裝飾器接口
//
public
interface
IDecorator : IPlayer
///
///
裝飾器的抽象基類
///
public
abstract
class
DecoratorBase : IDecorator
{
protected
IPlayer play
=
null
;
public
DecoratorBase(IPlayer player)
{
this
.play
=
player;
}
#region
IPlayer 成員
public
abstract
void
Play();
#endregion
}
///
///
音樂播放器裝飾器
///
public
class
MusicDecorator : DecoratorBase
{
public
MusicDecorator(IPlayer play)
:
base
(play)
{
}
public
override
void
Play()
{
throw
new
NotImplementedException();
}
}
///
///
視頻播放器裝飾類
///
public
class
VedioDecorator : DecoratorBase
{
public
VedioDecorator(IPlayer play)
:
base
(play)
{
}
public
override
void
Play()
{
throw
new
NotImplementedException();
}
}
具體的測試調用代碼以下:
static
void
Main(
string
[] args)
{
IPlayer play
=
new
Player();
play
=
new
MusicDecorator(play);
play
=
new
VedioDecorator(play);
}
通過了2次的裝飾後,該播放器對象,能夠播聽任何格式的文件。經過上面的過程,咱們發現了咱們在使用裝飾模式的時候,有以下幾點咱們須要把我好:
一、咱們在開發的過程當中,若是須要爲某個類型添加多個職責的時候,咱們須要多個裝飾實現類,這樣類太多的時候,咱們須要將這個對象裝飾屢次。
二、咱們對咱們的裝飾過的對象,如何指定的撤銷某個裝飾過程的狀態呢?相似咱們使用某些應用程序中的undo操做。
三、對於動態裝飾的對象,咱們debug的時候,咱們很難跟蹤和調試。
6、裝飾模式的其餘方案
裝飾模式的具體過程以下: 
1、經過配置文件來完成裝飾操做
具體的操做過程以下:配置文件中配置對象要完成的裝飾步驟,經過公共的配置讀取類,經過字典緩存裝飾的步驟,而後傳入普通的對象,返回裝飾後的對象。

咱們這裏給出配置文件的格式:
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。