/*
* 将抽象和行为划分开来,各自独立,但能动态的结合。
*
* 例如,一杯咖啡为例,子类实现类为四个:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。
但是,我们注意到:上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶 不加奶(如加橙汁 加苹果汁).
实现四个子类在抽象和行为之间发生了固定的绑定关系,如果以后动态增加加葡萄汁的行为,就必须再增加两个类:中杯加葡萄汁和大杯加葡萄汁。显然混乱,扩展性极差。
*/
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();