装饰模式
2015-12-27 17:05
288 查看
装饰模式
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
以小菜的穿衣打扮为例,第一版:
此时,如果要添加装扮,就得修改Person类,但是,这就违背了开放封闭的原则,因此,应该把这些服饰都写成子类,第二版:
小菜扮靓第三版:
装饰模式是为已有功能,动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码,通常装饰了原有类的核心职责或主要行为。
它们在主类中加入了新的字段,新的方法或新的逻辑,从而增加了主类的负责度,而这些新加入的东西,仅仅是为了满足一些只在某种特定情况下,才会执行的特 殊行为的需要。
装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要,有选择的、按顺序的使用装饰功能包装对象了。
装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做得更大好处是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
以小菜的穿衣打扮为例,第一版:
<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>
装饰模式是为已有功能,动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码,通常装饰了原有类的核心职责或主要行为。
它们在主类中加入了新的字段,新的方法或新的逻辑,从而增加了主类的负责度,而这些新加入的东西,仅仅是为了满足一些只在某种特定情况下,才会执行的特 殊行为的需要。
装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要,有选择的、按顺序的使用装饰功能包装对象了。
装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做得更大好处是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
相关文章推荐
- Android开发和測试实践 - 接入友盟统计
- 大数据日知录笔记1--大数据存储
- android之旅12 activity之间的跳转与生命周期
- 27.iPhone加速度传感器简单介绍
- CentOS7 引导win7
- ScrollView和ListView冲突解决
- Redis整合Spring结合使用缓存实例
- RabbitMQ搭建
- Linux常用命令 - ifconfig
- Android M 新的运行时权限开发者需要知道的一切
- zabbix之rpm快速部署
- android偏好设置
- Java之网络编程TCP&DUP
- wamp2.5 配置多端口虚拟主机
- 返回页面
- iOS开发之数据存储(偏好设置)
- hdu2412Party at Hali-Bula【树型DP入门题】
- xcode import<xx/xx.h> 头文件报错
- 分治法求连续子数组的最大和
- Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not found解决办法