第 6 章 —— 裝飾模式

6.6 裝扮模式總結

    裝飾模式把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它所要裝飾的對象,因此,當需要執行特殊行為時,客戶端代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。

    裝扮模式是為已有功能動態地添加更多功能的一種方式。

  裝飾模式的優點:

    有效地把類的核心職責和裝飾功能區分開了(將裝飾功能從類中移除,簡化了原有的類)。而且可以去除相關類中重復的裝飾邏輯(具體的裝飾類都繼承了抽象裝飾類)。

  需要注意的問題:

    裝飾模式的順序很重要,比如加密數據和過濾詞匯都可以是數據持久化(存儲)以前的裝飾功能,但若先加密了數據再用過濾功能就會出問題了,最理想的情況,是保證裝飾類之間彼此獨立,這樣它們就可以以任意的順序進行組合了。

6.4 裝飾模式

    裝飾模式,動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

基本的實現代碼:

  Component 類:

      abstract class Component{public abstract void Operation();}

    Component 定義了一個對象接口(抽象類的抽象方法),可以給這些對象動態地添加職責。

  ConcreteComponent 類:

      class ConcreteComponent : Component{public override void Operation(){Console.WriteLine("具體對象的操作");}}

    ConcreteComponent定義了一個具體的對象,也可以給這個對象添加一些職責。

  Decorator 類:(抽象的裝飾類,需要繼承定義的對象接口)

      abstract class Decorator : Component{protected Component component;public void SetComponent(Component component)       //設置Component
          {this.component = component;}public override void Operation()                    //重寫Operation(),實際執行的是Component的Operation()
          {if(component != null){component.Operation();}}}

    Decorator,抽象裝飾類,繼承了?Component,從類外面來擴展?Component 類的功能,但對于?Component 來說,是無需知道?Decorator 的存在的

  具體的裝飾類:

      class ConcreteDecoratorA : Decorator{private string addedState;          //本類的獨有功能,以區別于ConcreteDecoratorBpublic override void Operation(){base.Operation();       //首先運行原Component的Operation(),再執行本類的功能,如addedState,相當于對原Component進行了裝飾addedState = "New State";Console.WriteLine("具體裝飾對象A的操作");}}class ConcreteDecoratorB : Decorator{public override void Operation(){base.Operation();       //首先運行原Component的Operation(),再執行本類的功能,AddBehavitor(),相當于對原Component進行了裝飾
              AddBehavitor();Console.WriteLine("具體裝飾對象A的操作");}private void AddBehavitor()         //本類獨有的方法,以區別于ConcreteDecoratorA
          {}}

  客戶端代碼:

        static void Main(string[] args){ConcreteComponent c = new ConcreteComponent();ConcreteDecoratorA d1 = new ConcreteDecoratorA();ConcreteDecoratorB d2 = new ConcreteDecoratorB();d1.SetComponent(c);d2.SetComponent(d1);d2.Operation();         //裝飾的方法是:首先用ConcreteComponent實例化對象c,然后用ConcreteDecoratorA的實例化對象d1來包裝c,再用ConcreteDecoratorB的對象d2包裝d1,最終執行d2的Operation()
Console.Read();}

6.5 裝飾模式的實際應用

  “Person” 類(ConcreteComponent)

      class Person{public Person(){ }private string name;public Person(string name){this.name = name;}public virtual void Show(){Console.WriteLine("裝扮的{0}", name);}}

  服飾類(Decorator)

      class Finery : Person{protected Person component;//打扮public void Decorate(Person component){this.component = component;}public override void Show(){if(component != null){component.Show();}}}

  具體服飾類(ConcreteDecorator)

    class TShirts : Finery{public override void Show(){Console.WriteLine("大T恤 ");base.Show();}}class BigTrouser : Finery{public override void Show(){Console.WriteLine("垮褲 ");base.Show();}}

  客戶端代碼

        static void Main(string[] args){Person xc = new Person("小菜");Console.WriteLine("\n第一種裝扮:");BigTrouser kk = new BigTrouser();       //垮褲TShirts dtx = new TShirts();            //大T恤
kk.Decorate(xc);            //裝扮過程
            dtx.Decorate(kk);dtx.Show();Console.Read();}

?

轉載于:https://www.cnblogs.com/zhangchaoran/p/8538062.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

廣義表及其存儲方式簡介

廣義表(Lists,又稱列表)是線性表的推廣。線性表定義為n>0個元素a1,a2,a3,…,an的有限序列。線性表的元素僅限于原子項,原子是作為結構上不可分割的成分,它可以是一個數或一個結構,若放松對表元素的這種限…

Vue.js:路由

ylbtech-Vue.js:路由1.返回頂部 1、Vue.js 路由 本章節我們將為大家介紹 Vue.js 路由。 Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。 通過 Vue.js 可以實現多視圖的單頁Web應用(single page web application,SPA)。 Vue.…

圖片轉excel:“保留數字格式”在什么場景下該勾

保留數字格式是什么意思呢?顧名思義,就是將轉出來的數字保留為數字格式,而不是文本格式。我們知道,OCR程序將圖片上的文字識別為電腦可編輯的文字后,如果導入到excel不加處理,則單個數字過長的文字就會被ex…

html概述和基本結構

html概述 HTML是 HyperText Mark-up Language 的首字母簡寫,意思是超文本標記語言,超文本指的是超鏈接,標記指的是標簽,是一種用來制作網頁的語言,這種語言由一個個的標簽組成,用這種語言制作的文件保存的是…

linux添加三權,基于SELinux的三權分離技術的研究

目前,Linux操作系統已廣泛應用于各種設備和產品中,如服務器、PC機、機頂盒及路由器等。隨著Linux系統的不斷發展和廣泛應用,Linux系統的安全問題也引起越來越多的關注。在Linux操作系統中,存在一個超級用戶即root用戶。root也稱為…

二叉樹、樹和有序樹的區別

樹:子樹沒有左右之分 二叉樹、有序樹:左右有序 二叉樹與有序樹:在只有一棵樹的情況下,二叉樹有左右之分、有序樹無左右之分 另外:二叉樹是有序的,可以為空或一個根節點以及兩個分別稱為左子樹和右子樹的互不相交的二叉…

高效程序員

軟件開發人員的作戰手冊 - 讓程序員活的久一點 1. 程序員的職業準則是:誠實(如實的報告你的狀態,風險和出現的問題),守信(承諾完成的任務就要按時完成),尊重(尊重給你的代…

PHP學習筆記1

1.什么是PHP? Hypertext Preprocessor(超文本預處理語言)。 是腳本語言。 是最流行的網站開發語言。 2.PHP能做什么? 可以生成動態頁面內容。 可以創建、打開、讀取、寫入、關閉服務器上的文件。 可以手機表單數據。 可以發送和接收cookies。&#xf…

Redis在windows下的配置

原文:Redis在windows下的配置 Redis在windows下的配置(在windows-64下安裝redis,請參考微軟redis的github:https://github.com/MSOpenTech/redis/releases)下面是windows32的配置 下載地址http://files.cnblogs.com/files/cuiweny…

linux磁盤符變化autofs,Linux基礎教程學習筆記之Autofs自動掛載

Linux基礎教程學習筆記之Autofs自動掛載Autofs自動掛載:yum -y install autofsvim /etc/auto.master 在文件中添加下面行/home/guests /etc/auto.tianyunvim /etc/auto.tianyun 子掛載點監控ldapuser0 -rw,sync classroom:/home/guests/ldapuser0systemctl enable …

二叉樹的遞歸遍歷(先序,中序,后序)

#include "stdio.h" #include "malloc.h" #define M 100 typedef struct node { /* 采用二叉鏈表存儲結構 */char data;struct node *lchild,*rchild; }BTnode; BTnode *create()/*利用先序遍歷的過程創建二叉樹*/ {BTnode *t;char ch;scanf("%c&quo…

DOM-動態操作心得

這個知識點都是之前看過的,就當是復習了 一、創建元素的三種方法 第一種: document.write() 識別標簽但會覆蓋之前內容第二種: 用元素自身的innerHTML方法 不識別標簽但可以不覆蓋之前內容 ul.innerHTML "<li></li>"; 第三種:利用DOM自身api創建元素 …

linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力

內容簡介1、第四部分第一課&#xff1a;壓縮文件&#xff0c;解壓無壓力2、第四部分第二課&#xff1a;SSH連接&#xff0c;安全快捷壓縮文件&#xff0c;解壓無壓力最近小編因為換工作&#xff0c;從南法搬到巴黎。折騰了很久。網絡一直用的是公共的無線網&#xff0c;信號不行…

遍歷二叉樹的全部方法(遞歸+非遞歸)

#include<iostream> #include<queue> #include<stack> using namespace std; //二叉樹結點的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍…

如何在本地搭建一個Android應用crashing跟蹤系統-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一個Andr…

20165222第一周查漏補缺

一&#xff0c;第一章要點總結 1&#xff0c;java的特點&#xff1a;面向對象&#xff0c;動態&#xff0c;平臺無關。 2&#xff0c;對于帶包程序的編譯&#xff1a;注意javac -d 編譯到一個文件夾內&#xff0c;然后java -cp 文件夾名 包名.類名。 第一章是比較簡單的&#x…

學習中的十七條建議

作者&#xff1a;孤劍 對于一個自學的人來說&#xff0c;幾條規則當然是必要的了&#xff0c;以下是我自己的一些心得。 1。自信是你成功的第一要素&#xff1b; 2。用心去學&#xff0c;活學活用&#xff1b; 3。新手不要“好高騖遠”&#xff0c;老手不要“驕傲自大”&#x…

tp5 linux路由不跳轉,thinkphp5路由不生效一直跳到首頁的解決方法

自從用laravel框架后&#xff0c;好久沒用過thinkphp框架了&#xff0c;早期用的3.x系列&#xff0c;想熟悉一下thinkphp5&#xff0c;結果入坑了&#xff1b;路由配置一直不起作用&#xff0c;總是跳到首頁&#xff0c;折騰了好久&#xff0c;后來發現是nginx配置的問題&#…

stack堆棧簡介

stack堆棧簡介 堆棧是一個線性表&#xff0c;插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top)&#xff0c;另一端則為棧底(Stack Bottom)。堆棧的元素插入稱為入棧&#xff0c;元素的刪除稱為出棧。由于元素的入棧和出棧總在棧頂進行&#xff0c;因此&#xff0c;堆棧是…

一份從 0 到 1 的 Java 項目實踐清單

2019獨角獸企業重金招聘Python工程師標準>>> 看了一篇文章&#xff0c;感覺還可以&#xff0c;就給大家共享一下&#xff1a; 對于著手一個項目的時候&#xff0c;要從以下入手&#xff08;即項目清單&#xff09;&#xff1a; 1. 項目規劃 1.1 首先&#xff0c;你得…