装饰模式
来源:互联网 发布:软件工作量估计案例 编辑:程序博客网 时间:2024/04/28 13:13
装饰模式
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
以小菜的穿衣打扮为例,第一版:
<span style="font-size:24px;"><span style="font-size:24px;">#region//小菜第一版//Person类class Person{ private string name; public Person(string name) { this.name = name; } public void WearTShirts() { Console.Write("大T恤"); } public void WearBigTrouser() { Console.Write("垮裤"); } public void WearSneakers() { Console.Write("破球鞋"); } public void WearSuit() { Console.Write("西装"); } public void WearTie() { Console.Write("领带"); } public void WearLeatherShoes() { Console.Write("皮鞋"); } public void Show() { Console.WriteLine("装扮的{0}", name); }}#endregion</span></span>
<span style="font-size:24px;"><span style="font-size:24px;"> #region//小菜第一版 Person xc = new Person("小菜"); Console.WriteLine("\n第一种装扮:"); xc.WearTShirts(); xc.WearBigTrouser(); xc.WearSneakers(); xc.Show(); Console.WriteLine("\n第二种装扮"); xc.WearSuit(); xc.WearTie(); xc.WearLeatherShoes(); xc.Show(); Console.Read(); #endregion</span></span>
此时,如果要添加装扮,就得修改Person类,但是,这就违背了开放封闭的原则,因此,应该把这些服饰都写成子类,第二版:
<span style="font-size:24px;">//Person类class Person{ private string name; public Person(string name) { this.name = name; } public void Show() { Console.WriteLine("装扮的{0}", name); }}//服饰抽象类//服饰abstract class Finery{ public abstract void Show();}//各种服饰子类//大T恤class TShirts : Finery{ public override void Show() { Console.Write("大T恤"); }}//垮裤class BigTrouser : Finery{ public override void Show() { Console.Write("垮裤"); }}//破球鞋class Sneakers : Finery{ public override void Show() { Console.Write("破球鞋"); }}//西装class Suit : Finery{ public override void Show() { Console.Write("西装"); }}//领带class Tie : Finery{ public override void Show() { Console.Write("领带"); }}//皮鞋class LeatherShoes : Finery{ public override void Show() { Console.Write("皮鞋"); }}</span>
<span style="font-size:24px;"> #region//小菜第二版 Person xc = new Person("小菜"); Console.WriteLine("\n第一种装扮:"); Finery dtx = new TShirts(); Finery kk = new BigTrouser(); Finery pqx = new Sneakers(); dtx.Show(); kk.Show(); pqx.Show(); xc.Show(); Console.WriteLine("\n第二种装扮:"); Finery xz = new Suit(); Finery ld = new Tie(); Finery px = new LeatherShoes(); xz.Show(); ld.Show(); px.Show(); xc.Show(); Console.Read(); #endregion</span>
小菜扮靓第三版:
<span style="font-size:24px;">#region//小菜第三版//Person类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 TShirt : 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(); }}#endregion</span>
<span style="font-size:24px;"> #region//小菜第三版 Person xc = new Person("小菜"); Console.WriteLine("\n第一种装扮:"); Sneakers pqx = new Sneakers(); BigTrouser kk = new BigTrouser(); TShirt dtx = new TShirt(); 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(); #endregion</span>
装饰模式是为已有功能,动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码,通常装饰了原有类的核心职责或主要行为。
它们在主类中加入了新的字段,新的方法或新的逻辑,从而增加了主类的负责度,而这些新加入的东西,仅仅是为了满足一些只在某种特定情况下,才会执行的特 殊行为的需要。
装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要,有选择的、按顺序的使用装饰功能包装对象了。
装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做得更大好处是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
1 0
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- IOS九宫格设计源码(外加添加删除功能)
- 求二维数组中的鞍点【数组】
- 指针练习——变量交换I
- 输入10个数字,然后逆序输出
- Minesweeper
- 装饰模式
- web项目设置全局变量
- 最拥堵的路段
- FPGA
- 【PS】改变图标颜色
- QGis 二次开发基础 -- 显示数据
- xcode import<xx/xx.h> 头文件报错
- asp.net网页间传值方式之Response.Redirect和Server.Transfer
- IO_字节流_节点流_文件夹拷贝_工具制作_文件后缀与软件的关系JAVA149、163