用最简便的例证驾驭装饰器格局,实例教程

正文以实例格局详细讲述了C#装饰器形式的贯彻方式。分享给我们供大家仿效。具体落到实处格局如下:

要是有三个公司要做产品套餐,即把差别的产品组合在同步,分裂的叁结合对应分裂的标价。最终显示出来的效能是:把产品组合的持有因素展现出来,并呈现该结合的价格。

就算有贰个百货店要做产品套餐,即把分裂的产品组合在联合,区别的三结合对应不一样的标价。最终展现出来的成效是:把产品组合的享有因素展现出来,并体现该结合的价钱。

现假存在叁个同盟社要做产品套餐,即把不相同的产品组合在一齐,分裂的3结合对应分化的价位。最后展现出来的效益是:把产品组合的具有因素显示出来,并显示该组合的价钱。

 

 

各个产品都盛名称和价格,首先设计一个关于产品的肤浅基类。

各个产品都闻明称和价格,首先设计1个关于产品的空洞基类。

种种产品都有名称和价格,首先设计三个有关产品的虚幻基类。

public abstract class ProductBase
{
    public abstract string GetName();
    public abstract double GetPrice();
}
    public abstract class ProductBase

    {

        public abstract string GetName();

        public abstract double GetPrice();

    }
    public abstract class ProductBase

    {

        public abstract string GetName();

        public abstract double GetPrice();

    }

负有的出品都不可能不承袭那个基类,举例家居用品、电器产品等,把这几个实际的成品提炼成二个后续ProductBase的子类。

 

 

public class ConcretProuct : ProductBase
{
    private string _name;
    private double _price;
    public ConcretProuct(string name, double price)
    {
      this._name = name;
      this._price = price;
    }
    public override string GetName()
    {
      return _name;
    }
    public override double GetPrice()
    {
      return _price;
    }
}

装有的成品都无法不承继这几个基类,比如家居用品、电器产品等,把那几个实际的产品提炼成二个承接ProductBase的子类。

享有的产品都必须延续这一个基类,举例家居用品、电器产品等,把这么些具体的成品提炼成贰个三番四回ProductBase的子类。

下一场思索产品组合。举个例子卖平底锅,或然送老抽,也可能有望送生抽+老坛酸菜,恐怕的叁结合包含:

 

 

  1. 平底锅
  2. 平底锅 + 酱油
  3. 底层锅 + 老抽 + 老坛梅菜  
    public class ConcretProuct : ProductBase

    {

        private string _name;

        private double _price;

        public ConcretProuct(string name, double price)

        {

            this._name = name;

            this._price = price;

        }

        public override string GetName()

        {

            return _name;

        }

        public override double GetPrice()

        {

            return _price;

        }

    }
    public class ConcretProuct : ProductBase

    {

        private string _name;

        private double _price;

        public ConcretProuct(string name, double price)

        {

            this._name = name;

            this._price = price;

        }

        public override string GetName()

        {

            return _name;

        }

        public override double GetPrice()

        {

            return _price;

        }

    }

在那边,能够把老抽,老坛贡菜当做是装饰器,因为每加一个产品,都以在原有的底子上加码的。比方做”平底锅

 

 

  • 老抽”那些组合,是在”平底锅”的根底上平添了”老抽”。

然后挂念产品组合。举个例子卖平底锅,大概送生抽,也许有望送生抽+老坛贡菜,可能的重组包含:
○ 平底锅
○ 平底锅 + 酱油
○ 平底锅 + 酱油 + 老坛酸菜   

下一场思考产品组合。比方卖平底锅,大概送生抽,也会有十分的大可能率送酱油+老坛梅菜,可能的咬合包含:
○ 平底锅
○ 平底锅 + 酱油
○ 平底锅 + 酱油 + 老坛梅菜   

当今把老抽、老坛梅菜也陈设成承接ProductBase的子类,约等于装饰器类。可是,与ConcretProuct类分化的是,装饰器类须求引用ProductBase,在此处,无论是显示产品组合依然合算产品产品组合价格,都离不开这些引用的ProductBase。

 

 

public class Decorator : ProductBase
{
    private ProductBase _product = null;
    private string _name;
    private double _price;
    public Decorator(ProductBase product, string name, double price)
    {
      this._product = product;
      this._name = name;
      this._price = price;
    }
    public override string GetName()
    {
      return string.Format("{0},{1}", _product.GetName(), _name);
    }
    public override double GetPrice()
    {
      return _product.GetPrice() + _price;
    }
}

在此处,能够把老抽,老坛酸菜当做是装饰器,因为每加三个成品,都是在原本的根底上扩充的。举个例子做”平底锅

在这里,可以把生抽,老坛酸菜当做是装饰器,因为每加二个成品,都以在原本的根基上扩张的。比方做”平底锅

如上,展现产品名称的时候,把装饰器类Decorator引用的ProductBase的名号和当前名称组合起来,以逗号分隔;展现产品价格的时候,把引用的ProductBase的价格和脚下价格相加。

  • 生抽”这一个组合,是在”平底锅”的基本功上增添了”老抽”。
  • 生抽”那么些组合,是在”平底锅”的根底上加码了”老抽”。

客户端如下:

 

 

class Program
{
    static void Main(string[] args)
    {
      ConcretProuct livingProduct = new ConcretProuct("平底锅",100);
      Console.WriteLine(PrintProductDetails(livingProduct));
      Decorator dec1 = new Decorator(livingProduct,"海鲜酱油",10);
      Console.WriteLine(PrintProductDetails(dec1));
      Decorator dec2 = new Decorator(dec1, "老坛酸菜",12);
      Console.WriteLine(PrintProductDetails(dec2));
      Console.ReadKey();
    }
    private static string PrintProductDetails(ProductBase product)
    {
      return string.Format("产品组合:{0}   价格:{1}", product.GetName(), product.GetPrice());
    }
}

于今把老抽、老坛贡菜也计划成承继ProductBase的子类,也便是装饰器类。可是,与ConcretProuct类分裂的是,装饰器类需求引用ProductBase,在那边,无论是展现产品组合依旧合算产品产品组合价格,都离不开这么些引用的ProductBase。

到现在把生抽、老坛酸菜也筹算成承继ProductBase的子类,相当于装修器类。可是,与ConcretProuct类不一致的是,装饰器类必要引用ProductBase,在这里,无论是彰显产品组合依旧合算产品产品组合价格,都离不开这么些引用的ProductBase。

运维结果如下图所示:

 

 

图片 1

   public class Decorator : ProductBase

    {

        private ProductBase _product = null;

        private string _name;

        private double _price;

        public Decorator(ProductBase product, string name, double price)

        {

            this._product = product;

            this._name = name;

            this._price = price;

        }

        public override string GetName()

        {

            return string.Format("{0},{1}", _product.GetName(), _name);

        }

        public override double GetPrice()

        {

            return _product.GetPrice() + _price;

        }

    }
   public class Decorator : ProductBase

    {

        private ProductBase _product = null;

        private string _name;

        private double _price;

        public Decorator(ProductBase product, string name, double price)

        {

            this._product = product;

            this._name = name;

            this._price = price;

        }

        public override string GetName()

        {

            return string.Format("{0},{1}", _product.GetName(), _name);

        }

        public override double GetPrice()

        {

            return _product.GetPrice() + _price;

        }

    }

指望本文所述对大家C#先后设计的求学抱有援助。

 

 

您或然感兴趣的文章:

  • 深远分析设计形式中的装饰器情势在iOS应用开采中的达成
  • 实例疏解Ruby使用设计形式中的装饰器情势的章程
  • 分析Python中设计格局之Decorator装饰器格局的要点
  • 学习php设计方式php完成装饰器方式(decorator)
  • Python的装饰器形式与面向切面编制程序详解
  • PHP、Python和Javascript的装饰器方式比较
  • java设计方式之桥接格局(Bridge)
  • java设计情势之组成形式(Composite)
  • java设计情势之阅览者形式
  • java设计形式之装饰器方式(Decorator)

上述,展现产品名称的时候,把装饰器类Decorator引用的ProductBase的称号和脚下名称组合起来,以逗号分隔;突显产品价格的时候,把引用的ProductBase的价位和近来价位相加。

以上,彰显产品名称的时候,把装饰器类Decorator引用的ProductBase的称呼和日前名称组合起来,以逗号分隔;突显产品价格的时候,把引用的ProductBase的标价和当下价格相加。

 

 

客户端如下:

客户端如下:

    class Program

    {

        static void Main(string[] args)

        {

            ConcretProuct livingProduct = new ConcretProuct("平底锅",100);

            Console.WriteLine(PrintProductDetails(livingProduct));

            Decorator dec1 = new Decorator(livingProduct,"海鲜酱油",10);

            Console.WriteLine(PrintProductDetails(dec1));

            Decorator dec2 = new Decorator(dec1, "老坛酸菜",12);

            Console.WriteLine(PrintProductDetails(dec2));

            Console.ReadKey();

        }

        private static string PrintProductDetails(ProductBase product)

        {

            return string.Format("产品组合:{0}     价格:{1}", product.GetName(), product.GetPrice());

        }

    } 
    class Program

    {

        static void Main(string[] args)

        {

            ConcretProuct livingProduct = new ConcretProuct("平底锅",100);

            Console.WriteLine(PrintProductDetails(livingProduct));

            Decorator dec1 = new Decorator(livingProduct,"海鲜酱油",10);

            Console.WriteLine(PrintProductDetails(dec1));

            Decorator dec2 = new Decorator(dec1, "老坛酸菜",12);

            Console.WriteLine(PrintProductDetails(dec2));

            Console.ReadKey();

        }

        private static string PrintProductDetails(ProductBase product)

        {

            return string.Format("产品组合:{0}     价格:{1}", product.GetName(), product.GetPrice());

        }

    } 

图片 2 

图片 2 

  

  

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注