我们如何将 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”项目?

如何将 UIPageControl 与 iCarousel 一起使用?

将 Func 委托与 Async 方法一起使用

将委托与消息一起使用

将 Kotlin 属性委托与 by 一起使用时出现 NullPointerException (NPE)