装饰模式

来源:互联网 发布:io 广东 域名 编辑:程序博客网 时间:2024/09/21 09:18

装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。

要点:装饰者与被装饰者拥有共同的超类

装饰者包含一个超类的对象,这样,可以在被装饰者行为前或者行为后加上新的行为,甚至取代原有的行为。

装饰者会使程序中出现很多小类,增加使用难度

 

我们都知道,可以使用两种方式给一个类或者对象添加行为。

 一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机 

二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。 

与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象


 

装饰模式的组成

1)抽象构件角色(Component):定义一个抽象类或接口,以规范准备接收附加责任的对象。

2)具体构件角色(ConcreteComponent):这是被装饰者,定义一个将要被装饰增加功能的类。

3)装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的类、抽象类或接口。

4)具体装饰角色(ConcreteDecorator):负责给构件添加增加的功能,扩展行为

 

以汉堡为例,

代码如下:

using UnityEngine;using System.Collections;//抽象构件类public abstract class Humburger   {protected string _description = "UnKnow ";public virtual string GetDescription (){return _description;}public abstract float GetPrice();}//具体构件类A(鸡腿堡)public class ChickenBurger  : Humburger {public ChickenBurger (){_description = "鸡腿堡";}public override float GetPrice(){return 15f;}}//具体构件类B(鸡蛋堡)public class EggBurger : Humburger {public EggBurger(){_description = "鸡蛋堡";}public override float GetPrice(){return 8f;}}//装饰类public class BurgerDecorator : Humburger{private Humburger _humburger;public void Decorator(Humburger _bur){_humburger = _bur;}public override string GetDescription (){return _humburger.GetDescription();}public override float GetPrice(){return _humburger.GetPrice();}}//具体装饰类A沙拉public class Sara:BurgerDecorator{public override string GetDescription (){return base.GetDescription() +" , 沙拉";}public override float GetPrice(){return base.GetPrice() + 1f;}}//具体装饰类B糖public class Sugar:BurgerDecorator{public override string GetDescription (){return base.GetDescription() +" , 糖";}public override float GetPrice(){return base.GetPrice() + 0.5f;}}

测试运行:

using UnityEngine;using System.Collections;public class TestDecorate : MonoBehaviour {void Start () {Humburger _myBurger = new ChickenBurger();Sara _sara = new Sara();Sugar _sugar = new Sugar();_sara.Decorator(_myBurger);_sugar.Decorator(_sara);print(_sugar.GetDescription() +" ; 价格:" + _sugar.GetPrice());}}

运行结果:鸡腿堡 ,沙拉 , ;价格:16.5



0 0
原创粉丝点击