我们如何将 OCP 与委托一起使用?
Posted
技术标签:
【中文标题】我们如何将 OCP 与委托一起使用?【英文标题】:How we can use OCP with delegation? 【发布时间】:2012-05-21 09:09:21 【问题描述】:有很多在继承的帮助下使用 OCP 的示例。但我很困惑我们如何将 OCP 与委派一起使用。任何人都可以分享任何样品吗?
【问题讨论】:
【参考方案1】:您可以将基类委托给派生类,就像Template pattern 一样。这是通过允许派生类开放扩展,但基类仍将关闭修改。
这是一个 C++ 示例:
class BaseClass
public:
void doStuff()
doStuff1(); // delegating to derived class
// do base class stuff here
doStuff2(); // delegating to derived class
// do more base class stuff here
doStuff3(); // delegating to derived class
protected:
virtual void doStuff1() = 0;
virtual void doStuff2() = 0;
virtual void doStuff3() = 0;
;
class DerivedClass1 : public BaseClass
protected:
void doStuff1() /* your impl here */
void doStuff2() /* your impl here */
void doStuff3() /* your impl here */
;
// Implement as many other derived classes as you wish
请注意,您不必修改 BaseClass(它对 mods 关闭)并将其委托给派生类,并且可以实现更多派生类(对扩展开放)
【讨论】:
【参考方案2】:如果我正确获得“委托”,这可能看起来像这样(C#):
class Product
public decimal Price get;set;
class Basket
IEnumerable<Product> _products;
Func<Product, decimal> _taxCalculator;
public Basket(IEnumerable<Product> products, Func<Product, decimal> taxCalculator)
_products = products;
_taxCalculator = taxCalculator;
public decimal CalculateBasketValue()
decimal sum = 0;
foreach (var product in _products)
sum += product.Price + _taxCalculator(product);
return sum;
public static void Main()
var products = new []
new Product Price = 100
;
var twentyPercentTax = new Func<Product, decimal>(product => product.Price * 0.2m);
var basket = new Basket(products, twentyPercentTax);
Console.WriteLine(basket.CalculateBasketValue());
该类已关闭计算篮子的价值。但是,它对计算税收的方式是开放的。计算税收被委托给 taxCalculator。您可以轻松拥有一堆税收计算器,并根据国家或其他任何内容选择其中一个。
【讨论】:
以上是关于我们如何将 OCP 与委托一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何将代表与 NSKeyedUnarchiver 一起使用?
如何将 SimplSockets 与委托一起用于“hello world”项目?