標籤:des cWeb style blog http color java 使用
裝飾模式:動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更為靈活。
Component是定義一個對象介面,可以給這些對象動態地添加職責。ConcreateComponet是定義了一個具體的對象,也可以給這個對象添加一些職責。Decorator,裝飾抽象類別,繼承了Component,從外類來擴充Component類的功能,但對於Component來說,是無需知道Decorator的存在的。至於ConcreateDecorator就是具體的裝飾對象,起到給Component添加職責的功能。
裝飾模式是利用SetComponent來對對象進行封裝的,這樣每個裝飾對象的實現就和如何使用這個對象分離開了,每個裝飾對象只關心自己的功能,不需要關係如何被添加到對象鏈當中。
裝飾模式總結:
裝飾模式是為已有功能動態地添加更多功能的一種方式。
裝飾模式把每個要裝飾的功能放在單獨的類中,並讓這個類封裝它所要裝飾的對象,因此,當需要執行特殊行為時,客戶代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能封裝對象了。
裝飾模式的優點:
把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。有效地把類的核心職責和裝飾功能區分開了。而且可以去除相關類中重複的裝飾邏輯。
範例程式碼:
using System;using System.Collections.Generic;using System.Text;namespace 裝飾模式{ 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.WriteLine("\n第三種裝扮:"); Sneakers pqx2 = new Sneakers(); LeatherShoes px2 = new LeatherShoes(); BigTrouser kk2 = new BigTrouser(); Tie ld2 = new Tie(); pqx2.Decorate(xc); px2.Decorate(pqx); kk2.Decorate(px2); ld2.Decorate(kk2); ld2.Show(); Console.Read(); } } class Person { public Person() { } private string name; public Person(string name) { this.name = name; } public virtual void Show() { Console.WriteLine("裝扮的{0}", name); } } class Finery : Person { protected Person component; //打扮 public void Decorate(Person component) { this.component = component; } public override void Show() { if (component != null) { component.Show(); } } } class TShirts : Finery { public override void Show() { Console.Write("大T恤 "); base.Show(); } } class BigTrouser : Finery { public override void Show() { Console.Write("垮褲 "); base.Show(); } } class Sneakers : Finery { public override void Show() { Console.Write("破球鞋 "); base.Show(); } } class Suit : Finery { public override void Show() { Console.Write("西裝 "); base.Show(); } } class Tie : Finery { public override void Show() { Console.Write("領帶 "); base.Show(); } } class LeatherShoes : Finery { public override void Show() { Console.Write("皮鞋 "); base.Show(); } }}
完整源碼(漸層過程)下載:06裝飾模式.rar