【設計模式】——裝飾模式(Decorator)
裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
就以穿衣服為例,無論是鞋子、領帶、披風都是對人的裝飾。
定義一個人類
<strong><span style="font-family:KaiTi_GB2312;"> class Person { public Person() { } private string name; public Person(string name) { this.name = name; } public virtual void Show() { Console.WriteLine("裝扮的{0}",name ); } }</span></strong>
服飾類
<strong><span style="font-family:KaiTi_GB2312;"> class Finery :Person { protected Person component; //打扮 public void Decorate(Person component) { this.component = component; } public override void Show() { if (component !=null ) { component.Show(); } } }</span></strong>
各衣服的類
<strong><span style="font-family:KaiTi_GB2312;">//垮褲
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮褲");
base.Show();
}
}</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//皮鞋 </span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class LeatherShoes : Finery
{
public override void Show()
{
Console.Write("皮鞋");
base.Show();
}
}</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;"> //破球鞋
class Sneakers : Finery
{
public override void Show()
{
Console.Write("破球鞋");
base.Show();
}
}</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//西裝 </span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class Suit : Finery
{
public override void Show()
{
Console.Write("西裝");
base.Show();
}
}</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//領帶</span></strong>
<strong><span style="font-family:KaiTi_GB2312;"> class Tie : Finery
{
public override void Show()
{
Console.Write("領帶");
base.Show();
}
}</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//大T恤</span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class Tshirts :Finery
{
public override void Show()
{
Console.Write("大T恤");
base.Show();
}
}</span></strong>
客戶端程式碼
<strong><span style="font-family:KaiTi_GB2312;"> class Program
{
static void Main(string[] args)
{
Person xc = new Person("小菜");
Console.WriteLine("\n第一種裝扮:");
Sneakers pqx = new Sneakers();
BigTrouser kk = new BigTrouser();
Tshirts dtx = new Tshirts();
pqx.Decorate(xc);
kk.Decorate(pqx );
dtx.Decorate(kk);
dtx.Show();
Console.WriteLine("\n第二種裝扮");
LeatherShoes px = new LeatherShoes();
Tie ld = new Tie();
Suit xz = new Suit();
px.Decorate(xc);
ld.Decorate(px );
xz.Decorate(ld );
xz.Show();
Console.Read();
}
}</span></strong>
效果:
裝飾模式把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的物件,當需要只想特殊行為時,客戶程式碼就可以在執行時根據需要有選擇地、按順序地使用裝飾功能包裝物件。
我理解的是,我們每個人都是一個客戶端,我們的每一件衣服就是一個已經包裝好了的類,當我們使用裝飾模式時,就相當於我們在打扮自己,我們選擇穿哪一件衣服,穿衣服的順序等等。
相關推薦
設計模式:裝飾器(Decorator)模式
讓我 分享圖片 底部 .com 一件事 輸出 PE 新的 int 設計模式:裝飾器(Decorator)模式 一、前言 裝飾器模式也是一種非常重要的模式,在Java以及程序設計中占據著重要的地位。比如Java的數據流處理,我們可能看到數據流經過不同的類的包裝和包裹,最
設計模式之裝飾者(Decorator)模式
首先來看一個場景,如圖: 工人分為很多種類,比如電工,管道工等等,同時又有A公司的電工,B公司的電工,A公司的管道工,B公司的管道工等等,那麼當有M個工種和N個公司的時候,就會有 M * N 個子類,這個繼承體系就會變得很龐大和複雜。那麼如何簡化呢,那麼
【設計模式】——裝飾模式(Decorator)
裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 就以穿衣服為例,無論是鞋子、領帶、披風都是對人的裝飾。 定義一個人類 <s
設計模式(7)—— 結構型 —— 裝飾器(Decorator )
介紹 定義:在不改變原有物件基礎之上,將功能附加到物件上 說明:在擴充套件原有物件功能方面,提供了比繼承更有彈性的替代方案 型別:結構型 適用場景: 擴充套件一個類的功能或給一個類新增附加職責 動態地給一個
【設計模式】——裝飾模式
【裝飾模式】 裝飾模式是利用component來對物件進行包裝。每個裝飾物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心如何被新增到物件鏈當中 【介紹】 主要解決:一般的,我們為了拓展一個類經常使用繼承方法實現,由於繼承為類引入靜
【設計模式】-附錄A(1)
一.什麼是設計模式? “每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複的勞動” 二.面向物件,面向過程的區別和聯絡 面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步的實現,使用的時候一個
【java設計模式】之 代理(Proxy)模式
代理模式的核心作用就是通過代理,控制對物件的訪問。這跟實際中是一樣的,比如說明星都有經紀人,這就是一個代理,比如有人要找某明星拍戲,那麼首先處理這事的是他的經紀人,雖然拍戲需要自己拍,但是拍戲前後的一些必須要做的事等等,都由這個經紀人來處理。 在程式中也是如此,通過
【設計模式】裝飾模式
能力要求:抽象能力 + 業務知識 設計要結合具體的業務,如果業務知識不夠,常常容易出現設計過度的現象——那些不常變的地方,簡單即可。事實上,很多良好的設計都是迭代而來的,設計並非一成不變,如果從一開始就想設計好,很容易陷入過度設計。 Q:設計一個類,其職責是
【註冊碼】Matlab7.0(R14)註冊碼
.com power baidu spf 註冊 word kdt iyu https Matlab 7 (R14) 註冊碼1:14-13299-56369-16360-32789-51027-35530-39910-50517-56079-43171-43696-14148
【Python初學者】合並(拼接)字符串
Python【Python初學者】合並(拼接)字符串
【總結整理】地圖投影(轉)
相對 十分 body 角度 投影 解析 經緯度坐標 福特 曲面 1.地球橢球體 地球是一個表面很復雜的球體,人們以假想的平均靜止的海水面形成的“大地體”為參照,推求出近似的橢球體,理論和實踐證明,該橢球體近似一個以地球短軸為軸的橢園而旋轉
Day22 【小程序】Credit Card(ATM),購物程序調用信用卡程序接口支付
logger nts 實現 管理 加載 相關 actions bin 目錄 程序介紹: 實現信用卡(ATM)常用功能:(支持多賬戶登陸)1.取款;2.還款;3.轉賬;4.查詢余額;5.查詢賬單(流水,支持按年月日時分秒記錄); 程序結構:ATM/├── README├─
Python 裝飾器(Decorator)
highlight () 註冊 內部 AI 面積 return 使用 工作 裝飾器的語法為 @dec_name ,置於函數定義之前。如: import atexit @atexit.register def goodbye(): print(‘Goodbye
(轉)python裏為什麽需要使用裝飾器(decorator)
上線 深入 add 指導 對象 引用 是否 寫代碼 學習 出處 為什麽需要使用裝飾器呢?其實很多人學習python之後都會問這個問題。這一次,我來深入地學習一下什麽是裝飾器,以及為什麽需要它。其實這個裝飾器就是我們這樣的程序員太“懶”了,基本上什麽
【Absible學習】Ansible playbook (一)
tags 列表 最好 test list playbook ppi -m color * 簡介 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於復雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。play
【AtCoder - 4242 】To Infinity(思維)
題幹: Problem Statement Mr. Infinity has a string S consisting of digits from 1 to 9. Each time the date changes, this st
【OpenAI-Gym】學習記錄(一)gym安裝
前言 最近在學習強化學習( Reinforcement Learning ),自學過程包括理論學習部分與演算法學習部分。理論學習部分安利一本書籍 Richard S. Sutton 的 Reinforcement Learning : An Introduction;演算法學習主要為使用
2018.11.07【校內模擬】數獨(模擬)
傳送門 解析: 直接模擬,隨手寫了一個壓位的二進位制優化數獨,並沒有什麼用,好處只有搜尋才能體現出來吧。。。 程式碼: #include<bits/stdc++.h> using namespace std; #define ll long lon
【POJ 3368】Frequent values(RMQ)
Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you a
【Short Brain】——mini-story(八)
What The guy named Joe. He wanted to be a famous movie star. So the first he get thin and have the good body. The he stopped eating dairy prod