2014-10-09 51 views
0

可以说我有一个类,需要一个委托:委托模式是否破坏封装?

public class DelegateContainer 
{ 
    private IDelegate delegate; 

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

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

正如你可以看到委托的doSomethingOnlyForThisPurpose()方法只存在于由委托类调用。但是这个方法是公开的,并且可以由任何东西执行。如果它绝对不应该被它所附加的委托类之外的任何东西执行(特别是如果委托类传入一个依赖),那么这不会破坏封装吗?我认为解决这个问题的唯一方法是设计一个对象,该对象只能由传递给每个调用方法的委托类(内部类)实例化。然而,这是非常复杂的,而不是无论如何不水密。有没有办法解决这个问题还是病理性的?

注:我想坚持这种构图方法,所以我宁愿不诉诸继承。

回答

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. 
    } 
} 

结论:你不应该有所谓的doSomethingOnlyForThisPurpose如果“OnlyForThisPurpose”非私有方法意味着它是不安全的(你已经知道这一点),并且如果你“害羞”地发布它(这是个坏消息),你不应该在你的课堂之外调用你的方法(通过DelegateContainer)。这是一个设计问题,但不是代理模式病理。