2014-07-15 132 views
0

下面的ProductService類從數據庫獲取基於不同過濾器(如日期,國家等)的產品。 ProductsService不遵循OCP,因爲添加新的過濾器(如按價格獲取產品)需要更改ProductsService代碼。如何修復?任何建議/意見將非常有幫助。針對不同過濾器條件的開放閉合原理

public class ProductsService : IProductsService 
{ 
    public FilteredProducts GetProductsByDate(DateTime startDate, DateTime EndDate) 
    { 
     //..... 

    } 
    public FilteredProducts GetProductsByCountry(string country) 
    { 
     //..... 

    } 

    public FilteredProducts GetProductsByCity(string city) 
    { 
     //..... 

    } 

} 

public class FilteredProducts 
{ 
    public IEnumerable<Product> Products{set;get;} 
    public int uniqueProducts { set; get; } 
} 

public class Product 
{ 
    public int ID{set;get;} 
    public string Name{set;get;} 
    public decimal Cost{set;get;} 
} 

回答

0

最好的方法是將每個操作表示爲單獨的類。

public interface IProductFilter 
    { 
     FilteredProducts GetProducts(); 
    } 

    public class GetProductsByDate : IProductFilter 
    { 
     private DateTime _startDate; 
     private DateTime _endDate; 

     public GetProductsByDate(DateTime startDate, DateTime EndDate) 
     { 
      _startDate = startDate; 
      _endDate = EndDate; 
     } 

     public FilteredProducts GetProducts() 
     { 
      // filter 
     } 
    } 

然後,您可以將此實現傳遞到您的服務中,並在其中執行。

public class ProductsService : IProductsService 
    { 
     public FilteredProducts FilterProducts(IProductFilter filter) 
     { 
      // execute the filter 
      // return the products 
     } 
    } 

你甚至可以去儘可能把它變成通用的命令(例如here),並通過它執行所有的數據庫邏輯,拋棄了「服務」反模式。

-3

這裏的要求是爲每個新的過濾器添加算法而不改變服務等級。戰略模式符合這一要求。希望這是有幫助的。

+0

其實不,它沒用。請在您的描述中添加更多細節(如何操作,而不是如何操作),並且包含一些代碼,因爲原始的海報會盡力實現。 –

+0

對不起。我的錯。用戶「不安」在幾分鐘前添加了上述模式的示例代碼。 – Brijesh

0

我將有一個接口調用IFilter,它負責FilterConstraints合同。

public interface IFilter 
    { 
     void FilterConstraints(String FilterConstraints); 
    } 

然後,我會有負責過濾的類,並讓這些類實現IFilter Inetrface。

public class FilterByCountry : IFilter 
{ 
    public void FilterConstraints(string FilterConstraints) 
    { 
     //**Your Filter Constraints**/ 
    } 
} 

public class FilterByCity : IFilter 
{ 
    public void FilterConstraints(string FilterConstraints) 
    { 
     /**Your Filter Constraints **/ 
    } 
} 

這是有一個構造函數的主類,初始化的IFilter(這是各種FilterClassed中常見)

public class ProductService 
{ 
    private IFilter _filter=null; 

    public ProductService(IFilter Filter) 
    { 
     _filter = Filter; 
    } 


    public void FilterProducts(String Constraints) 
    { 
     _filter.FilterConstraints(Constraints); 
    } 
} 

所以,如果你想打電話Filterbased上FilterByCountry現在,它會像

var filterbycountry=new FilterByCountry(); 
var Filter=new ProductService(filterbycountry); 
filter.FilterProducts("your constraints"); 

美中不足的是,如果你想添加一個過濾器,你得有一個新的類,並實現IFilter的該過濾器類,並從product.That調用的就是你r擴展但不修改類,保留開放和關閉原則

+0

我將增加更多的解釋..遲到辦公室.. – Rangesh

+0

如果你有多個過濾器,但只有一個服務,這不會真正起作用。而當你的服務是長壽/單身。通常情況下是這樣。 – Euphoric