Head First 设计模式----DecoratorPattern

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public abstract class Beverage
    {
        public String description = "Unknow beverage";

        public virtual String getDescription()
        {
            return description;
        }

        public abstract Double cost();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public abstract class CondimentDecorator:Beverage
    {
        public abstract String getDescription();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class DarkRoast:Beverage
    {
        public DarkRoast() {
            description = "DarkRoast Coffe";
        }
       
        public override Double cost()
        {
            return 0.99;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public abstract class Decaf:Beverage
    {

        public Decaf() {
            description = "Decaf Coffee";
        }

        public override Double cost()
        {
            return 1.05;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class Espresso:Beverage
    {
        public Espresso() {
            description = "Espresso Coffee";
        }

        public override Double cost()
        {
            return 1.99;        
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class HouseBlend:Beverage
    {
        public HouseBlend() {
            description = "House Blend Coffee";
        }

        public override Double cost()
        {
            return 0.89;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class Milk :Beverage
    {
        Beverage beverage;

        public Milk(Beverage beverage)
        {
            this.beverage = beverage;
        }

        public override String getDescription() {
            return beverage.getDescription() + ",Milk";
        }

        public override Double cost()
        {
            return 0.10 + beverage.cost();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class Mocha : Beverage
    {
        Beverage beverage;

        public Mocha(Beverage beverage) {
            this.beverage = beverage;
        }

        public override String getDescription()
        {
            return beverage.getDescription() + ",Mocha";
        }

        public override Double cost() {
            return 0.20 + beverage.cost();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class Soy : Beverage
    {
        Beverage beverage;

        public Soy(Beverage beverage)
        {
            this.beverage = beverage;
        }

        public override String getDescription()
        {
            return beverage.getDescription() + ",Soy";
        }

        public override Double cost()
        {
            return 0.15+beverage.cost();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HeadFirst.Decorator
{
    public class Whip : Beverage
    {
        Beverage beverage;

        public Whip(Beverage beverage){
            this.beverage = beverage;
        }

        public override String getDescription()
        {
            return this.beverage.getDescription() + ",Whip";
        }

        public override Double cost()
        {
            return 0.10 + beverage.cost();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HeadFirst.Decorator;


namespace HeadFirst
{
    class Program
    {
        static void Main(string[] args)
        {
            //Decorator装饰者模式
            Beverage beverage = new Espresso();
            Console.Write(beverage.getDescription() + ":" + beverage.cost());
            Console.ReadLine(); 
        }
    }
}
原文地址:https://www.cnblogs.com/SmileX/p/4189234.html