Home > Design Pattern > Bridge Pattern (桥模式) 第二篇

Bridge Pattern (桥模式) 第二篇

之前写过一篇关于桥模式的文章, 点击这里查看总感觉理解不太透彻, 今日又深入了解了一下:

对象是由对象的行为, 和对象的属性2部份组成. 桥模式可以理解为将对象的属性与行为分开, 然后再链接起来.
举个简单的例子, 星巴克的咖啡. 星巴克的咖啡有小杯的, 中杯的, 大杯的. 咖啡的种类有Mocha, Espresso,Cappuccino等.这里先暂时使用3种咖啡.

也就是说, 现在星巴克有
小杯Mocha, 小杯Espresso, 小杯Cappuccino,
中杯Mocha, 中杯Espresso, 大杯Cappuccino,
大杯Mocha, 大杯Espresso, 大杯Cappuccino 共9种组合.

所以, 我可以将杯子抽象出来, 将咖啡的种类抽象出来, 然后让这两个对象相互组合.

首先呢,需要定义一下咖啡的种类.

//这里定义了一个抽象的咖啡的类型的类, 不管什么类型的咖啡,总是要倒出来的. 所以都包含了一个倒咖啡的方法.
public abstract class CoffeeType
{
    public abstract void PourCoffee();
}
 
public class CoffeeMocha : CoffeeType
{
    public override void PourCoffee()
    {
        Console.WriteLine("这是Mocha咖啡");
    }
}
 
public class CoffeeEspresso : CoffeeType
{
    public override void PourCoffee()
    {
        Console.WriteLine("这是Espresso咖啡");
    }
}
 
public class CoffeeCappuccino : CoffeeType
{
    public override void PourCoffee()
    {
        Console.WriteLine("这是Cappuccino咖啡");
    }
}

咖啡的类型定义好了, 接下来需要定义的是杯子了.

public abstract class Coffee
{
    CoffeeType coffeeType;
    public CoffeeType CoffeeImplement
    {
        set { this.coffeeType = value; }
        get { return this.coffeeType; }
    }
    public abstract void PourCoffee();
}
//小杯
public class MediumCoffee : Coffee
{
    public override void PourCoffee()
    {
        CoffeeType coffeeType = this.CoffeeType;
        coffeeType.PourCoffee();
    }
}
 
//中杯
public class MediumCoffee : Coffee
{
    public override void PourCoffee()
    {
        CoffeeType coffeeImp = this.CoffeeType;
        coffeeType.PourCoffee();
    }
}
 
//大杯
public class BigCoffee : Coffee
{
    public override void PourCoffee()
    {
        CoffeeType coffeeImp = this.CoffeeType;
        coffeeType.PourCoffee();
    }
}

上面的咖啡杯, 和咖啡的种类都已经使用好了. 接下来就可以使用了.

CoffeeType coffeeImp = new CoffeeEspresso();
Coffee coffee = new MediumCoffee();
coffee.CoffeeImplement = coffeeImp;
coffee.PourCoffee();
//一杯中杯的Espresso可以喝了~

related post

Categories: Design Pattern Tags:
  1. No comments yet.
  1. No trackbacks yet.