首页 > 其他分享 >CSharp: Composite Pattern in donet 6

CSharp: Composite Pattern in donet 6

时间:2022-11-14 23:23:03浏览次数:36  
标签:donet Gift gift Composite Pattern price public

 

     /// <summary>
    /// 组合模式 Composite Pattern 亦称: 对象树、Object Tree、Composite Pattern
    /// </summary>
    public abstract class Gift
    {

        /// <summary>
        /// 
        /// </summary>
        protected readonly string _description;
        /// <summary>
        /// 
        /// </summary>
        protected decimal _price;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="description"></param>
        /// <param name="price"></param>
        protected Gift(string description, decimal price)
        {
            _description = description;
            _price = price;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public abstract decimal CalculatePrice();
    }


   /// <summary>
    /// 组合模式 Composite Pattern 亦称: 对象树、Object Tree、Composite Pattern
    /// </summary>
    public interface IGiftOperations
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="gift"></param>
        void Add(Gift gift);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="gift"></param>
        void Remove(Gift gift);
    }

 /// <summary>
    /// 组合模式 Composite Pattern 亦称: 对象树、Object Tree、Composite Pattern
    /// </summary>
    public class CompositeGift : Gift, IGiftOperations
    {
        /// <summary>
        /// This collection can store simple as well as composite gifts.
        /// </summary>
        private readonly List<Gift> _gifts;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="description"></param>
        public CompositeGift(string description)
            : base(description, 0)
        {
            _gifts = new List<Gift>();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="gift"></param>
        public void Add(Gift gift) =>
            _gifts.Add(gift);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="gift"></param>
        public void Remove(Gift gift) =>
            // Consider using HashSet or Dictionary if you need remove an item from a collection.
            _gifts.Remove(gift);
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override decimal CalculatePrice()
        {
            Console.WriteLine($"'{_description}' 包含以下产品及价格:");
            _price = _gifts.Sum(gift => gift.CalculatePrice());

            return _price;
        }
    }


/// <summary>
    /// 组合模式 Composite Pattern 亦称: 对象树、Object Tree、Composite Pattern
    /// </summary>
    public class SimpleGift : Gift
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="description"></param>
        /// <param name="price"></param>
        public SimpleGift(string description, decimal price)
            : base(description, price)
        {
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override decimal CalculatePrice()
        {
            Console.WriteLine($"'{_description}' with the price of {_price:C}");
            return _price;
        }
    }


 /// <summary>
    ///  组合模式 Composite Pattern 亦称: 对象树、Object Tree、Composite Pattern
    /// </summary>
    public static class GiftExecutor
    {

        /// <summary>
        /// /
        /// </summary>
        public static void Execute()
        {
            ConsoleExtension.WriteSeparator("组合模式 Composite Pattern:  Gift demo");

            var smartWatchGift = new SimpleGift("智能手表 Smart watch", 200);
            var smartWatchPrice = smartWatchGift.CalculatePrice();
            Console.WriteLine($"智能手表礼品总价: {smartWatchPrice:C}");

            Console.WriteLine();

            var familyGift = new CompositeGift("家庭的礼物");
            var dadsGift = new SimpleGift("钓鱼竿Fishing rod", 50);
            var momsGift = new SimpleGift("项链Necklace", 80);
            var childrenGift = new CompositeGift("孩子们的礼物Children gift");
            childrenGift.Add(new SimpleGift("士兵玩具Soldier toy", 40));
            childrenGift.Add(new SimpleGift("芭比玩具Barbie toy", 50));

            familyGift.Add(dadsGift);
            familyGift.Add(momsGift);
            familyGift.Add(childrenGift);

            var familyGiftPrice = familyGift.CalculatePrice();
            Console.WriteLine($"家庭礼物总价: {familyGiftPrice:C}");
        }
    }

  调用:、

            Geovin.Du.DuComposite.DuGift.GiftExecutor.Execute();
            Console.WriteLine();

  

输出:

组合模式 Composite Pattern:  Gift demo
--------------------------------------------------
'智能手表 Smart watch' with the price of ¥200.00
智能手表礼品总价: ¥200.00

'家庭的礼物' 包含以下产品及价格::
'钓鱼竿Fishing rod' with the price of ¥50.00
'项链Necklace' with the price of ¥80.00
'孩子们的礼物Children gift' 包含以下产品及价格::
'士兵玩具Soldier toy' with the price of ¥40.00
'芭比玩具Barbie toy' with the price of ¥50.00
家庭礼物总价: ¥220.00

  

 

标签:donet,Gift,gift,Composite,Pattern,price,public
From: https://www.cnblogs.com/geovindu/p/16890908.html

相关文章

  • AdoNetFirstDay
    01SqlConnectionDemousingSystem;usingSystem.Collections.Generic;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;......
  • CSharp: Bridge Pattern in donet 6
     ///<summary>///桥接模式BridgePattern-StructuralPattern///</summary>publicabstractclassDocument{///<summary>......
  • CSharp: Adapter Pattern in donet 6
     ///<summary>///适配器模式亦称:封装器模式、Wrapper、AdapterAdapterPattern///</summary>publicclassEmployee{///<s......
  • [Design Patterns] Creational patterns创建型模式
    摘抄:这里最大的障碍在于硬编码被实例化的类。创建型模式提供了不同的方式来去除需要实例化它们的代码中对具体类的显示指定。如果CreateMaze调用虚函数而不是construct......
  • CSharp: Prototype Pattern in donet 6
     ///<summary>///原型模式PrototypePattern///</summary>publicinterfaceIColorPrototype{///<summary>///......
  • CSharp: Singleton Pattern in donet 6
     ///<summary>///单例模式单件模式、SingletonPattern///</summary>publicabstractclassBaseGreeter{publicvirtualvoid......
  • CSharp: Classes, Structures, And Records in c# 10(donet 6)
     #regionRecordTypesRecordClassinC#10///<summary>///Positionalparameterssyntax///位置参数的语法///</summary>///<pa......
  • CSharp: Abstract Factory Pattern in donet 6
     usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceGeovinu.Du.DuAbstractFactory......
  • CSharp: Factory Method Pattern in donet 6
     ///<summary>///TheProductdeclarestheinterface,whichiscommontoallobjects///thatcanbeproducedbythecreator<seecref="Restau......
  • Checkerboard Pattern Shader
    写在前面:本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。由于本人水平有限难免出现错误,还请评论区指出,多多指教。部分图元和素材来源于网络,如有侵权请联系本......