《Head First 设计模式》C#版:三、修饰者模式

using UnityEngine;
using System.Collections;

/// <summary>
/// 装饰着模式
/// </summary>
public class DecoratorPattern : MonoBehaviour
{
    private void Start()
    {
        Beverage beverage = new Espresso(Beverage.CFSIZE.TALL);
        Debug.Log(beverage.GetDescription() + "  $ " + beverage.Cost());

        Beverage beverage2 = new DarkRoast(Beverage.CFSIZE.GRANDE);
        beverage2 = new MoCha(beverage2);
        beverage2 = new MoCha(beverage2);
        beverage2 = new Milk(beverage2);
        Debug.Log(beverage2.GetDescription() + " $ " + beverage2.Cost());

        Beverage beverage3 = new HouseBlend(Beverage.CFSIZE.VENTI);
        beverage3 = new Soy(beverage3);
        beverage3 = new MoCha(beverage3);
        beverage3 = new Milk(beverage3);
        Debug.Log(beverage3.GetDescription() + " $ " + beverage3.Cost());

        Beverage beverage4 = new Decaf(Beverage.CFSIZE.TALL);
        beverage4 = new Soy(beverage4);
        beverage4 = new MoCha(beverage4);
        beverage4 = new Milk(beverage4);
        beverage4 = new Soy(beverage4);
        Debug.Log(beverage4.GetDescription() + " $ " + beverage4.Cost());

    }
}

#region  星巴克咖啡店  

// ============  实现装饰者  及咖啡的配料 ============

public class Milk : CondimentDecorator
{
    protected Beverage m_veverage;
    public Milk(Beverage beverage)
    {
        m_veverage = beverage;
    }
    public override string GetDescription()
    {
        return m_veverage.GetDescription() + ", 牛奶";
    }
    public override double Cost()
    {
        return m_veverage.Cost() + 0.4;
    }
    public override CFSIZE GetSize()
    {
        return m_cfSize;
    }

}
public class Soy : CondimentDecorator
{
    protected Beverage m_beverage;
    public Soy(Beverage beverage)
    {
        m_beverage = beverage;
    }
    public override string GetDescription()
    {
        return m_beverage.GetDescription() + ", 豆浆 ";
    }
    public override double Cost()
    {
        return m_beverage.Cost() + 0.2;
    }
    public override CFSIZE GetSize()
    {
        return m_cfSize;
    }


}

/// <summary>
/// Mocha.装饰者
/// </summary>
public class MoCha : CondimentDecorator
{
    protected Beverage m_beverage;

    public MoCha(Beverage beverage)
    {
        m_beverage = beverage;
    }

    public override string GetDescription()
    {
        return m_beverage.GetDescription()  + ", 摩卡";
    }
    public override double Cost()
    {
        return m_beverage.Cost() + 0.2;
    }
    public override CFSIZE GetSize()
    {
        return m_cfSize;
    }


}


// ======= 抽象组件  beverage  具体组件 houseBlend 抽象装饰者 CondimentDecorator ======
/*
主要知识点:
            Java 继承中的方法变更只有  Override 一种方式,作用于虚函数表;
            C# 继承中的方法变更有 Override 和 New 两种方式,前者与 Java 相同,后者不作用于虚函数表,只对显式标记为子类的类型生效;
            Java 继承中的方法覆写可以隐式实现(即任何方法都可以被覆写,覆写只需签名相同即自动完成);
            C# 继承中的方法覆写必须要显式实现(即只有被标记为可覆写的方法才能被覆写,覆写必须使用 Override 关键字);

*/


/// <summary>
/// 饮料 抽象类  Beverage.
/// </summary>
public abstract class Beverage
{
    public enum CFSIZE
    {
        /// <summary>
        /// 小杯
        /// </summary>
        TALL,
        /// <summary>
        /// 中杯
        /// </summary>
        GRANDE,
        /// <summary>
        /// 大杯
        /// </summary>
        VENTI
    }
    /// <summary>
    /// 饮料品牌
    /// </summary>
    protected string m_description = "Unknown Beverage";
    protected CFSIZE m_cfSize = CFSIZE.GRANDE;
    protected double m_price = 0.0;

    /// <summary>
    /// 获得当前品牌
    /// </summary>
    /// <returns>The description.</returns>
    public virtual string GetDescription()
    {
        return m_description;
    }
    public abstract double Cost();
    /// <summary>
    /// 获取咖啡杯大小
    /// </summary>
    /// <returns>The size.</returns>
    public virtual CFSIZE GetSize(){
        return m_cfSize;
    }
}

/// <summary>
/// 调料的抽象类 也就是 装饰类 Decorator 
/// </summary>
public abstract class CondimentDecorator : Beverage
{
    public abstract override string GetDescription();
    public abstract override CFSIZE GetSize();
}

/// <summary>
/// 浓缩咖啡类
/// </summary>
public class Espresso : Beverage
{
    public Espresso(CFSIZE cFSIZE)
    {
        m_description = "浓缩咖啡类";
        m_price = 1.99;
        m_cfSize = cFSIZE;
        switch (m_cfSize)
        {
            case CFSIZE.TALL:
                m_description += " Small ";
                m_price += 0.1;
                break;
            case CFSIZE.GRANDE:
                m_description += " Middle ";
                m_price += 0.2;
                break;
            case CFSIZE.VENTI:
                m_description += " Large ";
                m_price += 0.3;
                break;
        }
    }

    public override double Cost()
    {
        return m_price;
    }
}
public class DarkRoast : Beverage
{
    public DarkRoast(CFSIZE cFSIZE)
    {
        m_description = "深培 ";
        m_price = 0.8;
        m_cfSize = cFSIZE;
        switch (m_cfSize)
        {
            case CFSIZE.TALL:
                m_description += " Small ";
                m_price += 0.1;
                break;
            case CFSIZE.GRANDE:
                m_description += " Middle ";
                m_price += 0.2;
                break;
            case CFSIZE.VENTI:
                m_description += " Large ";
                m_price += 0.3;
                break;
        }
    }
    public override double Cost()
    {
        return m_price;
    }

}
/// <summary>
/// 综合咖啡
/// </summary>
public class HouseBlend : Beverage
{
    public HouseBlend(CFSIZE cFSIZE)
    {
        m_description = "综合咖啡  ";
        m_price = 0.99;
        m_cfSize = cFSIZE;
        switch (m_cfSize)
        {
            case CFSIZE.TALL:
                m_description += " Small";
                m_price += 0.1;
                break;
            case CFSIZE.GRANDE:
                m_description += " Middle";
                m_price += 0.2;
                break;
            case CFSIZE.VENTI:
                m_description += " Large";
                m_price += 0.3;
                break;
        }
    }
    public override double Cost()
    {
        return m_price;
    }
}
/// <summary>
/// 无咖啡因咖啡
/// </summary>
public class Decaf : Beverage
{

    public Decaf(CFSIZE cFSIZE)
    {
        m_description = "无咖啡因咖啡 ";
        m_price = 0.9;
        m_cfSize = cFSIZE;
        switch(m_cfSize){
            case CFSIZE.TALL:
                m_description += " Small";
                m_price += 0.1;
                break;
            case CFSIZE.GRANDE:
                m_description += " Middle";
                m_price += 0.2;
                break;
            case CFSIZE.VENTI:
                m_description += " Large";
                m_price += 0.3;
                break;
        }
    }

    public override double Cost()
    {
        return m_price;
    }
}


#endregion
本书荣获2005年第十五届Jolt通用类图书震撼大奖。 本书英文影印被《程序员》等机构评选为2006年最受读者喜爱的十大IT图书之一 。 本书趋近完美,因为它在提供专业知识的同时,仍然具有相当高的可读性。叙述权威、文笔优美。 本书共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。最后章比较特别。第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词),第13章介绍如何进一步学习设计模式,如何发觉新的设计模式等主题,至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype、Visitor。第1章还介绍了四个OO基本概念(抽象、封装、继承、多态),而第1章到第9章也陆续介绍了九个OO原则(Principle)。千万不要轻视这些OO原则,因为每个设计模式背后都包含了几个OO原则的概念。很多时候,在设计时有两难的情况,这时候我们必须回归到OO原则,以方便判断取舍。可以这么说:OO原则是我们的目标,而设计模式是我们的做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值