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();
}
}
}