我有項目calles倉庫。倉庫中有產品。我想寫一個選項來通知倉庫預期的產品。我正在考慮這樣做:使用單身人士和調解人爲了溝通項目
- 創建一個新的Warehose.Common項目,該項目將被願意與倉庫交互的其他項目引用。
- 在Warehose.Common項目中,我將創建一個產品接口並將其命名爲IProduct。
使用單和調解員設計模式如下(不知道我正確地實現這些設計模式):
public sealed class ExpectedProductsMediator { private static volatile ExpectedProductsMediator _Instance; private static object _SyncRoot = new Object(); delegate IEnumerable<INoteProduct> ExpectedProductsGenerator(DateTime startDate, DateTime endDate); private IList<ExpectedProductsGenerator> _ExpectedProductsGenerators; private ExpectedProductsMediator() { _ExpectedProductsGenerators = new List<ExpectedProductsGenerator>(); } public static ExpectedProductsMediator Instance { get { if (_Instance == null) { lock (_SyncRoot) { if (_Instance == null) _Instance = new ExpectedProductsMediator(); } } return _Instance; } } public void AddExpectedProductsGenerator(ExpectedProductsGenerator generator) { _ExpectedProductsGenerators.Add(generator); } public void RemoveExpectedProductsGenerator(ExpectedProductsGenerator generator) { _ExpectedProductsGenerators.Remove(generator); } public IEnumerable<INoteProduct> GetExpectedProducts(DateTime startDate, DateTime endDate) { IEnumerable<INoteProduct> products = null; if (_ExpectedProductsGenerators.Any()) { products = _ExpectedProductsGenerators.First()(startDate, endDate); foreach (ExpectedProductsGenerator generator in _ExpectedProductsGenerators.Skip(1)) { products = products.Concat(generator(startDate, endDate)); } } return products; } }
這調解人將在Warehouse.Common項目。現在,如果想提供期望的產品B項目,它需要使用AddExpectedProductsGenerator註冊其發電機()方法:
public static class ExpectedProductsRegistrar {
static ExpectedProductsRegistrar() {
ExpectedProductsMediator.Instance.AddExpectedProductsGenerator(someGenerator);
}
}
每當倉庫需要得到預期的產品的所有它需要做的就是調用GetExpectedProducts () 方法。
這個實現有兩個問題:
- 它暴露了GetExpectedProducts()方法到所有其他項目。
- 爲了註冊中介,我需要使用靜態約束。
您對我的實施有什麼看法?有這種需求的更好的解決方案嗎?我正確使用設計模式嗎?
將產品數據寫入存儲器是有問題的,因爲產品數據可能會不時變化。每當倉庫調用GetExpectedProducts()時,它都會獲取最新的更新產品。我不想處理編輯並移除調解器中的預期產品。實際上,用戶可以獲得預期的產品,然後將其手動轉換爲存儲在Warehouse項目的數據庫中的實際產品。 – Naor