委托模式是否打破了封装?

时间:2014-10-09 20:56:42

标签: oop delegates encapsulation composition information-hiding

让我们说我有一个带代表的课程:

public class DelegateContainer
{
    private IDelegate delegate;

    public DelegateContainer(IDelegate delegate)
    {
        this.delegate = delegate;
    }

    public void doSomething()
    {
        delegate.doSomethingOnlyForThisPurpose();
    }
{

正如您所看到的,委托的doSomethingOnlyForThisPurpose()方法仅存在于委托类中。但是,要求此方法是公开的,并且可以由任何内容执行。如果它绝对不应该被附加的委托类以外的任何东西执行(特别是如果委托类传递依赖关系)那么这不会破坏封装吗?我想到的唯一方法是设计一个只能由委托类(内部类)实例化的对象,该类传递给每个被调用的方法。然而,这非常令人费解,而且无论如何都不是水密的。有什么方法可以解决这个问题还是病态的?

注意:我想坚持使用这种组合方法,所以我宁愿不采用继承。

1 个答案:

答案 0 :(得分:0)

它不应该破坏封装。您对IDelegate的实现会发布一些行为,这些行为可以由任何引用此实例的人调用,因此应该像所有其他公共行为一样使用所需的抽象实现。如果你想要任何人拥有一个实例,你可以公开你的构造函数。如果你不这样做,那么你确实喜欢(使用私有或受保护的构造函数)。

IDelegate.doSomethingOnlyForThisPurpose实现的目的应该是做它做的事情,无论DelegateContainer是否被调用。我的意思是,如果这种方法在“错误的双手”调用时很危险,那么它与DelegateContainer紧密耦合。在这种情况下,不是委托模式打破了封装。

快速说明一下:

我不知道你正在使用什么语言。在C#中,您可以明确地实现IDelegate.doSomethingOnlyForThisPurpose以供那些对此界面特别感兴趣的人使用:

class MyClass: IDelegate
{

    void IDelegate.doSomethingOnlyForThisPurpose() {

        // This method is only visible by 
        // who is representing your object as IDelegate.
        // It's not visible by who is representing it as MyClass.
    }
}

结论:如果“OnlyForThisPurpose”意味着随时调用它是不安全的(你已经知道了),你不应该有一个名为doSomethingOnlyForThisPurpose的非私有方法,你不应该希望你的方法在你的课外调用(DelegateContainer)如果你“害羞”发表它(那是坏消息)。这是设计问题,但不是代表模式病态。