装饰模式
来源:互联网 发布: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
- 装饰模式-撤销装饰
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- MongoDB(五)mongo语法和mysql语法对比学习
- HDU 1269 迷宫城堡(Tarjan)
- 原始套接字的应用
- C语言中的头文件与源文件
- C++构造函数要点
- 装饰模式
- 黑马程序员--------继承
- windbg dump分析入门
- Linux 中如何安装卸载软件
- 第8周项目2
- 第8周项目2-加班费,要不要?
- poj 1936
- VS编译器优化诱发一个的Bug
- 黑马程序员--------交通灯管理系统