设计模式作业第二部分

using OrderSystem.Decorator;
using System;
using System.Collections.Generic;
using System.Linq;

namespace OrderSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            //配置+反射+简单工厂 创建菜的对象
            Menu.ShowMenu();

            var menuFoodList = Menu._FoodList.OrderBy(t => Guid.NewGuid()).Take(5).ToList();
            //随机点5个菜
            foreach (FoodForMenu mFood in menuFoodList)
            {
                AbstractFood food = OrderSimpleFctory.GetFood(mFood);
                food.CheerHandler += Diners.Cheer;
                food.CheerHandler += Masses.PublishArticle;
                food.Cook();
                food.Taste();
                food.Scoring();
            }
            //来个牛排
            AbstractFood steak = OrderSimpleFctory.GetFood(Menu._FoodList[7]);
            //steak.Cook();
            //steak.Taste();
            //steak.Scoring();
            //装饰器 买菜  洗菜  做菜  装盘  上菜
            //循序:要加在主动作之前的装饰,装饰器中的装饰步骤放在主动作之前
            //      要加在主动作之后的装饰,刚好相反
            //      主动作之前的装饰器,代码顺序和执行循序是相反的
            //      主动作之后的装饰器,代码顺序和执行循序是相同的
            Console.WriteLine("************************装饰器************************");
            steak = new WashFood(steak);
            steak = new BuyFood(steak);
            steak = new LoadingFood(steak);
            steak = new ServeFood(steak);
            steak.Cook();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem
{
    public class Menu
    {
        public static readonly List<FoodForMenu> _FoodList = null;
        private Menu()
        {
        }

        static Menu()
        {
            //构建菜单
            _FoodList = Config.GetFoodList();
        }

        public static void ShowMenu()
        {
            Console.WriteLine("***************************菜单**************************");
            foreach (var food in _FoodList)
            {
                Console.WriteLine($"{food.Id}--{food.Name}--{food.Price}");
            }
            Console.WriteLine("***************************End**************************");
        }
    }

    public class FoodForMenu
    {
        public int Id { set; get; }
        public string Name { set; get; }
        public decimal Price { set; get; }
        public string Dll { set; get; }
        public string NameSpace { set; get; }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Extensions.Configuration;

namespace OrderSystem
{
    public static class Config
    {
        private static IConfigurationRoot _config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
        private static List<FoodForMenu> _foodList = new List<FoodForMenu>();
        public static List<FoodForMenu> GetFoodList()
        {
            if (!_config.GetSection("FoodList:0").Exists())
                return null;
            var foodList = _config.GetSection("FoodList").GetChildren();// ["FoodList"];
            foreach (var food in foodList)
            {
                _foodList.Add(new FoodForMenu()
                {
                    Id = Convert.ToInt32(_config[$"{food.Path}:Id"]),
                    Name = _config[$"{food.Path}:Name"],
                    Price = Convert.ToDecimal(_config[$"{food.Path}:Price"]),
                    Dll = _config[$"{food.Path}:Dll"],
                    NameSpace = _config[$"{food.Path}:NameSpace"],
                });
            }
            return _foodList;
        }
    }
}
{
	"FoodList":[
		{"Id":1,"Name":"鱼香肉丝","Price":15.5,"Disciption":"四川名菜,比较甜","Dll":"SichuangFood","NameSpace":"SichuangFood.YuXiangRouSi"},
		{"Id":2,"Name":"日本豆腐","Price":15.0,"Disciption":"嫩豆腐","Dll":"SichuangFood","NameSpace":"SichuangFood.RiBenDoufu"},
		{"Id":3,"Name":"豆角茄子","Price":10.5,"Disciption":"比较油","Dll":"SichuangFood","NameSpace":"SichuangFood.DouJiaoQieZi"},
		{"Id":4,"Name":"宫保鸡丁","Price":15.5,"Disciption":"鸡丁很多","Dll":"SichuangFood","NameSpace":"SichuangFood.GongBaoJiDing"},
		{"Id":5,"Name":"回锅肉","Price":13.5,"Disciption":"吃起来比较干","Dll":"SichuangFood","NameSpace":"SichuangFood.HuiGuoRou"},
		{"Id":6,"Name":"梅菜扣肉","Price":30.5,"Disciption":"肥而不腻","Dll":"SichuangFood","NameSpace":"SichuangFood.MeiCaiKouRou"},
		{"Id":7,"Name":"鱼头汤","Price":45.0,"Disciption":"鱼汤","Dll":"SichuangFood","NameSpace":"SichuangFood.YuTouTang"},
		{"Id":8,"Name":"牛排","Price":100.0,"Disciption":"西餐","Dll":"SteakAdapter","NameSpace":"SteakAdapter.SteakAdapter"}]
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem
{
    /// <summary>
    /// 抽象类中的方法尽量用虚方法或者抽象  谁知道以后哪个子类想增加变化
    /// </summary>
    public abstract class AbstractFood
    {
        public string Name { set; get; }
        public decimal Price { set; get; }
        public string Discription { set; get; }

        public virtual void Taste()
        {
            Console.WriteLine($"品尝{Name}");
        }

        public virtual void Scoring()
        {
            Random random = new Random();
            int score = random.Next(1, 6);
            Console.WriteLine($"--------------------评论打出{score}分!---------------");
            if (score == 5)
                CheerHandler?.Invoke();
        }

        public abstract void Cook();

        public event Action CheerHandler;
    }
}
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace OrderSystem
{
    public class OrderSimpleFctory
    {
        public static AbstractFood GetFood(FoodForMenu foodMenu)
        {
            Assembly assembly = Assembly.LoadFrom(foodMenu.Dll);
            AbstractFood obj = assembly.CreateInstance(foodMenu.NameSpace) as AbstractFood;
            return obj;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem
{
   public class Diners
    {
        public static void Cheer()
        {
            Console.WriteLine($"欢呼");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem
{
   public class Masses
    {
        public static void PublishArticle()
        {
            Console.WriteLine($"发朋友圈");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem.Decorator
{
    public class FoodDecorator : AbstractFood
    {
        public AbstractFood _food = null;
        public FoodDecorator(AbstractFood abstractFood)
        {
            _food = abstractFood;
        }
        public override void Cook()
        {
            _food.Cook();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem.Decorator
{
    public class BuyFood : FoodDecorator
    {
        public BuyFood(AbstractFood abstractFood) : base(abstractFood)
        { }

        public override void Cook()
        {
            Console.WriteLine("买菜");
            _food.Cook();
            //base.Cook();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem.Decorator
{
    public class WashFood : FoodDecorator
    {
        public WashFood(AbstractFood abstractFood) : base(abstractFood)
        { }

        public override void Cook()
        {
            Console.WriteLine("洗菜");
            _food.Cook();
            //base.Cook();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem.Decorator
{
    public class LoadingFood : FoodDecorator
    {
        public LoadingFood(AbstractFood abstractFood) : base(abstractFood)
        { }

        public override void Cook()
        {
            _food.Cook();
            //base.Cook();
            Console.WriteLine("装盘");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace OrderSystem.Decorator
{
    public class ServeFood : FoodDecorator
    {
        public ServeFood(AbstractFood abstractFood) : base(abstractFood)
        { }

        public override void Cook()
        {
            _food.Cook();
            //base.Cook();
            Console.WriteLine("上菜");
        }
    }
}
using OrderSystem;
using System;

namespace SichuangFood
{
    public class DouJiaoQieZi : AbstractFood
    {
        public override void Cook()
        {
            Console.WriteLine("豆角茄子");
        }
    }
}
using OrderSystem;
using System;

namespace SichuangFood
{
    public class GongBaoJiDing : AbstractFood
    {
        public override void Cook()
        {
            Console.WriteLine("宫保鸡丁");
        }
    }
}
using System;

namespace WestFood
{
    /// <summary>
    /// 牛排不继承AbstractFood,所以在业务端得适配
    /// </summary>
    public class Steak
    {
        public string Name { set; get; }
        public decimal Price { set; get; }
        public string Discription { set; get; }

        public void TasteSteak()
        {
            Console.WriteLine($"品尝{Name}");
        }
        /// <summary>
        /// 评论和抽象类的打分方法名称不一样
        /// </summary>
        public void Comment()
        {
            Random random = new Random();
            Console.WriteLine($"牛排{random.Next(0, 10)}分熟!");
        }

        public void Cook()
        {
            Console.WriteLine("烧牛排");
        }
    }
}
using OrderSystem;
using System;
using WestFood;

namespace SteakAdapter
{
    public class SteakAdapter : AbstractFood
    {
        Steak steak = new Steak();
        public override void Cook()
        {
            steak.Cook();
        }
        /// <summary>
        /// 为了适配这个方法,AbstractFood中以前的普通方法改成虚方法,看来以后抽象类中尽量用虚方法或者抽象
        /// </summary>
        public override void Taste()
        {
            steak.TasteSteak();
        }

        public override void Scoring()
        {
            steak.Comment();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值