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

本文介绍了一种常用的设计模式——装饰者模式,并通过一个咖啡饮品的例子展示了如何使用该模式来动态地给对象添加职责,而不使用子类来进行扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值