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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

今日学习心得——装饰模式

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 今日学习心得——装饰模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天學習了大話設計模式中的裝飾模式,對這個模式的理解是在手動敲了代碼之后第三遍看代碼的時候才懂得的。我的心得就是,裝飾模式===>包裹模式。呵呵,包裹模式是我起的名字,我的理解是裝飾模式就是一層一層不斷地往被裝飾的對象上包裹上新的東西。

好了,現在說說裝飾模式,并來印證一下我的“包裹模式”的說法,哈哈。

裝飾模式的(Decorater):動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。【DP】這是從大話上抄的定義。下面是抄的類圖:

加上注釋的代碼

?

代碼 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 裝飾模式
{
/// <summary>
/// 定義一個對象接口,規定這些對象都要有Operation()方法
/// </summary>
abstract class Component
{
public abstract void Operation();
}
/// <summary>
/// 具體的對象類
/// </summary>
class ConcreteComponent : Component
{

public override void Operation()
{
Console.WriteLine(
"具體對象的操作");
}
}
/// <summary>
/// 裝飾抽象類,繼承自對象接口
///
/// 裝飾者類與Component類既是繼承關系,又是聚合關系
///
/// 在這個類中重寫Operation(),實際上還是執行傳入的Component對象的Operation(),
/// 這樣才能實現一層一層的包裝傳入的Component,賦予其新功能
/// </summary>
abstract class Decorator : Component
{
protected Component component;

public void SetComponent(Component component)
{
this.component = component;
}
//在這個類中重寫Operation(),實際上還是執行傳入的Component對象的Operation()
public override void Operation()
{
if (component != null)
{
component.Operation();
}
}
}
/// <summary>
/// 具體的裝飾類
/// </summary>
class ConcreteDecoretorA : Decorator
{
private string addedstate;
/// <summary>
///重寫Operation()
//首先調用父類的Operation(),然后增加新的內容(功能),------->也可以先進行增加新的內容的操作,再調用父類的Operation()
/// </summary>
public override void Operation()
{
base.Operation();
addedstate
= "New State";
Console.WriteLine(
"具體裝飾對象A的操作");
}
}
class ConcreteDecoretorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine(
"具體裝飾對象B的操作");
}
private void AddedBehavior()
{
Console.WriteLine(
"具體修飾類B獨有的方法");
}
}
/// <summary>
/// 客戶端使用方法
/// </summary>
class Program
{
static void Main(string[] args)
{
ConcreteComponent c
= new ConcreteComponent();//實例化一個具體的對象,這就是要被裝飾的原始對象
ConcreteDecoretorA d1 = new ConcreteDecoretorA();//實例化一個具體裝飾類A
ConcreteDecoretorB d2 = new ConcreteDecoretorB();//實例化一個具體裝飾類B

d1.SetComponent(c);
//將c賦予d1的component字段,完成d1對c的包裝
d2.SetComponent(d1);//將d1賦予d2的component字段,完成d1對c的第二次包裝,此處有為重要,不能傳c
d2.Operation();//執行最后進行包裝工作的對象的Operation()方法,這里的執行順序是理解這個模式的關鍵,最好使用f11跟一下。
Console.Read();
}
}
}

?

下載版:http://files.cnblogs.com/yuanyuan/%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f.rar

執行結果:

?

這個的示例的執行過程用文字描述如下:

首先是對象實例化和具體裝飾類內部字段的賦值:

?

代碼 ConcreteComponent c = new ConcreteComponent();//實例化一個具體的對象,這就是要被裝飾的原始對象
ConcreteDecoretorA d1 = new ConcreteDecoretorA();//實例化一個具體裝飾類A
ConcreteDecoretorB d2 = new ConcreteDecoretorB();//實例化一個具體裝飾類B

d1.SetComponent(c);
//將c賦予d1的component字段,完成d1對c的包裝
d2.SetComponent(d1);//將d1賦予d2的component字段,完成d1對c的第二次包裝,此處尤為重要,不能傳c

?

?

經過兩次包裝,可以用如下示意圖表示:

下面開始執行具體的顯示命令

?

d2.Operation();//執行最后進行包裝工作的對象的Operation()方法,這里的執行順序是理解這個模式的關鍵,最好使用f11跟一下。

?

當執行d2.Operation()時執行的是ConcreteDecoretorB中的如下代碼:

?

public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine(
"具體裝飾對象B的操作");
}

?

?

?

首先執行父類Decorator的Operation(),即如下代碼:

?

public override void Operation()
{
if (component != null)
{
component.Operation();
}
}

?

這個過程首先找到b2的component字段,執行它的Operation()

b2的component是b1,于是執行b1的Operation(),即如下代碼:

?

代碼 /// <summary>
///重寫Operation()
//首先調用父類的Operation(),然后增加新的內容(功能),------->也可以先進行增加新的內容的操作,再調用父類的Operation()
/// </summary>
public override void Operation()
{
base.Operation();
addedstate
= "New State";
Console.WriteLine(
"具體裝飾對象A的操作");
}

?

b1的Operation()也是首先找到b1的component字段c,然后執行c的Operation()

?

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

?

于是輸出第一行文字:具體對象的操作

然后,為b1的私有字段賦了值,并輸出:具體裝飾對象A的操作

至此,完成了b1的Operation()。

繼續執行b2的Operation(),執行的是b2的私有方法:AddedBehavior(),輸出了:具體修飾類B獨有的方法

最后輸出:具體裝飾對象B的操作

?

由此可見,裝飾模式的裝飾過程是通過將被裝飾對象賦給具體裝飾類實例的內部字段component,實現對被裝飾對象一層一層包裝的。而顯示過程是通過具體裝飾類對抽象裝飾父類的Operation()方法的類似遞歸引用(而這種類似遞歸的過程是通過引用內部字段component的Operation()實現的,所以Decorator與Concrete Compnent類必須繼承自一個父類,或者Decorator直接繼承ConcreteCompnent)的方式,實現一層一層的顯示出具體裝飾類對被修飾對象的包裝結果的。

?

做一下總結:

1.ConcreteComponent與Decorator類必須繼承自同一抽象父類,或讓ConcreteCompnenet直接作為Decoratior的父類。

2.Decorator類中有ConcreteComponent類型的字段

3.ConcreteDecorator類中重寫父類Operation()時需要使用base.Operation()調用父類的Operation()。

?

?

本文的一些心得為作者原創,希望能給你幫助,大家共同進步。雖然不是高深見解,也是費了作者一番心血,希望您在轉載的時候能夠保留原文鏈接。

轉載于:https://www.cnblogs.com/yuanyuan/archive/2010/07/06/1772148.html

總結

以上是生活随笔為你收集整理的今日学习心得——装饰模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人在线黄色 | 无码人妻丰满熟妇区五十路百度 | 精品国产av鲁一鲁一区 | 97人妻精品一区二区三区软件 | 成熟了的熟妇毛茸茸 | 狠狠干五月天 | 亚洲欧美视频一区二区 | 丁香激情六月 | 久久影音 | 青娱乐最新视频 | 海角社区id:1220.7126,10. | 国内一区二区三区 | a√天堂网 | aaa黄色大片| 日韩网站免费观看高清 | 男操女免费网站 | 欧美影视一区 | 久久精品视频一区二区 | 漂亮人妻被中出中文字幕 | 日韩精品免费观看 | 99热免费在线 | 999久久久| 欧美激情久久久久久 | 打屁股黄文| 国产免费一区二区视频 | 亚洲精品一区二三区 | 222aaa| 亚洲AV无码久久精品浪潮 | 日本孰妇毛茸茸xxxx | 看a网站 | 午夜日韩欧美 | 深夜视频在线播放 | 日韩欧美亚洲国产精品字幕久久久 | 亚洲黄色视屏 | av免费网站| 进去里片欧美 | 视频一区二区在线播放 | 午夜视频www | 在线视频一区二区三区四区 | 国产精品久久777777 | 亚洲视频播放 | 国产精品免费看片 | av在线免费网址 | 日韩插插插 | 中文字幕一区二区三区波野结 | 国产成人一区二区三区别 | 中文字幕高清在线免费播放 | 在线免费精品视频 | 国产高清一区在线观看 | 国产精品亚洲天堂 | 久久久噜噜噜久久中文字幕色伊伊 | 日本成人一区二区三区 | 最好看的日本字幕mv视频大全 | 国产一区二区高清视频 | 黄色网一级片 | 美女赤身免费网站 | www.国产成人 | 一级片在线观看视频 | 亚洲美女屁股眼交8 | 久久99久久99精品 | 欧美一区二区三区久久综合 | 午夜婷婷丁香 | 操啊操 | av导航站 | 手机看片中文字幕 | 懂色av蜜臀av粉嫩av喷吹 | 国产精品久久久久久久免费大片 | 麻豆精品视频 | 欧美做爰全过程免费看 | 久草视频在线资源站 | 久草视频在线观 | 国产91av在线播放 | 四虎影像| 老司机亚洲精品 | 日韩av一区在线观看 | 日本少妇一区二区 | 丝袜+亚洲+另类+欧美+变态 | 一区二区 中文字幕 | 亚洲一区欧美二区 | 韩国美女一区二区 | 综合视频 | 国产精品免费一区二区三区四区 | 中文字幕一区三区 | 美女被草出白浆 | 国产在线麻豆精品观看 | 国产精品久久久久久久久免费软件 | 爱福利视频一区二区 | 9i精品福利一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 欧美狠狠操 | 国产精品a久久久久 | 好吊一区 | 日韩美女少妇 | 夜夜操影视 | 色呦呦在线免费观看 | 日韩久久影视 | 欧美午夜在线观看 | 精品丝袜一区 | 免费久久 |