在继承的帮助下,有很多使用OCP的示例。但我对如何使用OCP和委托感到困惑。任何人都可以分享任何样本吗?
发布于 2012-05-21 17:13:17
您可以有一个基类,它像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关闭),并且它将委托给派生类,并且可以实现更多的派生类(对扩展开放)
发布于 2012-05-22 05:51:21
如果我正确理解了"delegation“,它可能看起来像这样(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。你可以很容易地拥有一堆税务计算器,并根据国家或其他任何条件选择其中一个。
https://stackoverflow.com/questions/10682374
复制相似问题