(10)spring常用模式--------裝飾者模式

1.裝飾者模式的簡介

裝飾模式:動態(tài)的給一個對象添加一些額外的職責预明,就增加功能來說瞬项,裝飾者到相比子類更加靈活

裝飾著的特點:裝飾器和被裝飾器都實現(xiàn)同一個接口羔巢, 主要目的裝飾器和被裝飾器都實現(xiàn)同一個接口, 主要目的是為了擴展之后依舊保留 OOP 關(guān)系(同宗同源)

應用場景:IO 流包裝浅妆、 數(shù)據(jù)源包裝墅诡、 簡歷包裝

為什么說是動態(tài)的將責任附加到對象身上壳嚎,因為裝飾者模式有了裝飾角色,就可以根據(jù)需要動態(tài)的裝飾不同的具體構(gòu)件角色和具體裝飾角色末早,這個具體構(gòu)件和裝飾角色是可以動態(tài)的切換的

在spring中的引用: Spring 的 ApplicationContext 中配置所有的 DataSource烟馅。 這些 DataSource 可能是各種不同類型的, 比如不同的數(shù)據(jù)庫: Oracle然磷、 SQL Server郑趁、 MySQL 等, 也可能是不同的數(shù)據(jù)源: 比如Apache 提 供 的 org.apache.commons.dbcp.BasicDataSource 姿搜、 Spring 提 供 的org.springframework.jndi.JndiObjectFactoryBean 等寡润。 然后 SessionFactory 根據(jù)客戶的每次請求, 將 DataSource 屬性設(shè)置成不同的數(shù)據(jù)源舅柜, 以到達切換數(shù)據(jù)源的目的梭纹。

在spring的命名體現(xiàn):Spring 中用到的包裝器模式在類名上有兩種表現(xiàn): 一種是類名中含有 Wrapper, 另一種是類名中含有Decorator致份。 基本上都是動態(tài)地給一個對象添加一些額外的職責

2.裝飾者模式的結(jié)構(gòu)

裝飾者模式以對客戶透明的方式動態(tài)地給一個對象附加上更多的責任变抽。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同氮块。裝飾者模式可以在不使用創(chuàng)造更多子類的情況下绍载,將對象的功能加以擴展。

裝飾者模式的類圖如下

裝飾者模式.png

在裝飾模式中的角色有:

  • 抽象構(gòu)件(Component)角色:給出一個抽象接口滔蝉,以規(guī)范準備接收附加責任的對象击儡。

  • 具體構(gòu)件(ConcreteComponent)角色:定義一個將要接收附加責任的類。

  • 裝飾(Decorator)角色:持有一個構(gòu)件(Component)對象的實例锰提,并定義一個與抽象構(gòu)件接口一致的接口曙痘。

  • 具體裝飾(ConcreteDecorator)角色:負責給構(gòu)件對象“貼上”附加的責任。

3.裝飾者模式的實例演示

實例介紹:
在原有的登錄的接口的情況下立肘,動態(tài)的增加了發(fā)送短信的功能

抽象構(gòu)件角色 定義登錄的接口

/**
 * @Project: spring
 * @description:     抽象構(gòu)件角色   登錄的接口業(yè)務
 * @author: sunkang
 * @create: 2018-09-05 20:51
 * @ModificationHistory who      when       What
 **/
public interface ISiginSerevice {
    ResultMsg login(String username, String password);
}

具體構(gòu)件角色 ,登錄的具體實現(xiàn)

/***
* @Description:
* @Param:   具體構(gòu)件角色    登錄的具體實現(xiàn)
* @return:
* @Author: sunkang
* @Date: 2018/9/5
*/
public class SiginService implements ISiginSerevice {
    /**
     * 登錄的方法
     * @param username
     * @param password
     * @return
     */
    public ResultMsg login(String username,String password){
        return  new ResultMsg("200","登錄成功",new Object());
    }
}

裝飾角色边坤,拓展了發(fā)送短信的功能

/**
 * @Project: spring
 * @description:    裝飾角色    拓展了發(fā)送短信的功能
 * @author: sunkang
 * @create: 2018-09-05 21:41
 * @ModificationHistory who      when       What
 **/
public interface ISiginForThirdService extends ISiginSerevice {
    /**
     * 原有登錄的方法
     * @param username
     * @param password
     * @return
     */
    ResultMsg login(String username, String password);
    /**
     * 發(fā)送短信
     * @param msg
     * @return
     */
     ResultMsg sendShortMessage(String msg);
}

具體的裝飾角色,原有的登錄功能動態(tài)增加了發(fā)送短信的功能

/**
 * @Project: spring
 * @description:  具體的裝飾角色    原有的登錄功能增加了發(fā)送短信的功能
 * @author: sunkang
 * @create: 2018-09-06 09:14
 * @ModificationHistory who      when       What
 **/
public class SiginForThirdService implements  ISiginForThirdService {
    private ISiginSerevice  siginSerevice ;
    public SiginForThirdService(ISiginSerevice siginSerevice) {
        this.siginSerevice = siginSerevice;
    }
    @Override
    public ResultMsg login(String username, String password) {
        ResultMsg msg =    siginSerevice.login(username,password);
        //注冊成功發(fā)送短信的功能
        if(msg.getCode().equals("200")){
            System.out.println("用戶登錄成功");
            msg = sendShortMessage(username);
        }
        return msg;
    }
    /**
     * 發(fā)送短信的功能   這個是裝飾器 增加的額外的功能,在登錄成功之后發(fā)送短信通知
     * @param username
     * @return
     */
    @Override
    public ResultMsg sendShortMessage(String username) {
        System.out.println("恭喜用戶:"+username+"發(fā)送短信成功");
        return new ResultMsg("200","發(fā)送短信成功",new Object());
    }
}

測試案例

/**
 * @Project: spring
 * @description:  裝飾者測試
 * @author: sunkang
 * @create: 2018-09-06 09:23
 * @ModificationHistory who      when       What
 **/
public class SiginTest {
    public static void main(String[] args) {

        ISiginSerevice siginSerevice = new SiginService();

        ISiginSerevice  siginForThirdService = new SiginForThirdService(siginSerevice);

        siginForThirdService.login("sunkang","4324");
    }
}

測試結(jié)果


裝飾者模式的測試結(jié)果.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谅年,一起剝皮案震驚了整個濱河市茧痒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌融蹂,老刑警劉巖旺订,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異超燃,居然都是意外死亡区拳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門意乓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樱调,“玉大人,你說我怎么就攤上這事届良“柿瑁” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵士葫,是天一觀的道長乞而。 經(jīng)常有香客問我,道長慢显,這世上最難降的妖魔是什么爪模? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮荚藻,結(jié)果婚禮上呻右,老公的妹妹穿的比我還像新娘。我一直安慰自己鞋喇,他們只是感情好声滥,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侦香,像睡著了一般落塑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罐韩,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天憾赁,我揣著相機與錄音,去河邊找鬼散吵。 笑死龙考,一個胖子當著我的面吹牛蟆肆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晦款,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼炎功,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缓溅?” 一聲冷哼從身側(cè)響起蛇损,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坛怪,沒想到半個月后淤齐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡袜匿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年更啄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居灯。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡锈死,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穆壕,到底是詐尸還是另有隱情待牵,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布喇勋,位于F島的核電站缨该,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏川背。R本人自食惡果不足惜贰拿,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熄云。 院中可真熱鬧膨更,春花似錦、人聲如沸缴允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽练般。三九已至矗漾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄料,已是汗流浹背敞贡。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摄职,地道東北人誊役。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓获列,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛔垢。 傳聞我的和親對象是個殘疾皇子击孩,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容