Как мы можем использовать OCP с делегацией?
-
12-12-2019 - |
Вопрос
Есть много образцов использования OCP с помощью наследования.Но я запутался, как мы можем использовать OCP с делегацией.Может кто-нибудь поделиться любым образцом?
Решение
Вы можете иметь базовый класс, который делегат в полученный класс, как с Шаблон шаблона .Это открыто для расширения, позволяя проводить полученные классы, но базовый класс все еще будет закрыт для модификации.
Вот пример в 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
.
Обратите внимание, что вам не нужно изменить базовый класс (его закрытый для модов), и он делегаты на полученные классы, и могут быть реализованы более полученные классы (открыты для расширения)
Другие советы
Если я получаю «делегацию» правильно, это может выглядеть так (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());
}
.
Класс закрыт для вычисления значения корзины.Однако он открыт для расчета налога.Расчет налога делегируется на налоговой гамма.Вы можете легко иметь кучу налоговых калькуляторов и выбрать один из них на основе страны или что-то еще.