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
《Head First 设计模式》C#版:三、修饰者模式
最新推荐文章于 2022-11-15 20:59:41 发布