委托模式是否破坏封装?
可以说我有一个类,需要一个委托:委托模式是否破坏封装?
public class DelegateContainer
{
private IDelegate delegate;
public DelegateContainer(IDelegate delegate)
{
this.delegate = delegate;
}
public void doSomething()
{
delegate.doSomethingOnlyForThisPurpose();
}
{
正如你可以看到委托的doSomethingOnlyForThisPurpose()方法只存在于由委托类调用。但是这个方法是公开的,并且可以由任何东西执行。如果它绝对不应该被它所附加的委托类之外的任何东西执行(特别是如果委托类传入一个依赖),那么这不会破坏封装吗?我认为解决这个问题的唯一方法是设计一个对象,该对象只能由传递给每个调用方法的委托类(内部类)实例化。然而,这是非常复杂的,而不是无论如何不水密。有没有办法解决这个问题还是病理性的?
注:我想坚持这种构图方法,所以我宁愿不诉诸继承。
它不应该打破封装。您的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
)。这是一个设计问题,但不是代理模式病理。