让我们说我有一个带代表的课程:
public class DelegateContainer
{
private IDelegate delegate;
public DelegateContainer(IDelegate delegate)
{
this.delegate = delegate;
}
public void doSomething()
{
delegate.doSomethingOnlyForThisPurpose();
}
{
正如您所看到的,委托的doSomethingOnlyForThisPurpose()方法仅存在于委托类中。但是,要求此方法是公开的,并且可以由任何内容执行。如果它绝对不应该被附加的委托类以外的任何东西执行(特别是如果委托类传递依赖关系)那么这不会破坏封装吗?我想到的唯一方法是设计一个只能由委托类(内部类)实例化的对象,该类传递给每个被调用的方法。然而,这非常令人费解,而且无论如何都不是水密的。有什么方法可以解决这个问题还是病态的?
注意:我想坚持使用这种组合方法,所以我宁愿不采用继承。
答案 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
)如果你“害羞”发表它(那是坏消息)。这是设计问题,但不是代表模式病态。