/*
* 將抽象和行爲劃分開來,各自獨立,但能動態的結合。
*
* 例如,一杯咖啡爲例,子類實現類爲四個:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。
但是,我們注意到:上面四個子類中有概念重疊,可從另外一個角度進行考慮,這四個類實際是兩個角色的組合:抽象 和行爲,其中抽象爲:中杯和大杯;行爲爲:加奶 不加奶(如加橙汁 加蘋果汁).
實現四個子類在抽象和行爲之間發生了固定的綁定關係,如果以後動態增加加葡萄汁的行爲,就必須再增加兩個類:中杯加葡萄汁和大杯加葡萄汁。顯然混亂,擴展性極差。
*/
using System;
namespace Pattern
{
/// <summary>
/// Summary description for Class1.
/// </summary>
///
public abstract class Coffee
{
CoffeeImp coffeeImp;
public void setCoffeeImp()
{
this.coffeeImp =CoffeeImpSingleton.getTheCoffeeImp(); //加奶,加糖
}
public CoffeeImp getCoffeeImp() {return this.coffeeImp;}
public abstract void pourCoffee(); //是大杯,還是小杯
}
/// <summary>
/// 是加不加奶的行爲
/// </summary>
public abstract class CoffeeImp
{
public abstract void pourCoffeeImp();
}
//中杯
public class MediumCoffee : Coffee
{
public MediumCoffee() {setCoffeeImp();}
public override void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我們以重複次數來說明是衝中杯還是大杯 ,重複2次是中杯
for (int i = 0; i < 2; i++)
{
coffeeImp.pourCoffeeImp();
}
}
}
//大杯
public class SuperSizeCoffee : Coffee
{
public SuperSizeCoffee() {setCoffeeImp();}
public override void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我們以重複次數來說明是衝中杯還是大杯 ,重複5次是大杯
for (int i = 0; i < 5; i++)
{
coffeeImp.pourCoffeeImp();
}
}
}
//加奶
public class MilkCoffeeImp : CoffeeImp
{
public MilkCoffeeImp() {}
public override void pourCoffeeImp()
{
System.Console .WriteLine ("加了美味的牛奶");
}
}
//不加奶
public class FragrantCoffeeImp : CoffeeImp
{
public FragrantCoffeeImp() {}
public override void pourCoffeeImp()
{
System.Console .WriteLine("什麼也沒加,清香");
}
}
public class CoffeeImpSingleton
{
private static CoffeeImp coffeeImp;
public CoffeeImpSingleton(CoffeeImp coffeeImpIn)
{
coffeeImp = coffeeImpIn;
}
public static CoffeeImp getTheCoffeeImp()
{
return coffeeImp;
}
}
}
// //橋樑模式
//
// //拿出牛奶
// CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());
//
// //中杯加奶
// Console.WriteLine("中杯加奶");
// MediumCoffee mediumCoffee = new MediumCoffee();
// mediumCoffee.pourCoffee();
//
// Console.WriteLine("大杯加奶");
// //大杯加奶
// SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
// superSizeCoffee.pourCoffee();