假设我们有一个接口'IA',我们有一个实现'A'。 在我们的应用程序域中,如果没有容器对象'X',对象'A'永远不会存在。所以'A'永远不会直接操作。 'A'汇总在'X'。
我们不想向外界揭露'A'。为此,我们采用了这种方法,而不是使用公共接口“IA”并直接在“X”中使用实现“A”。不知怎的,我觉得这不是正确的方法。可能是我错过了一些基本的OO概念。
请发表意见。
PS:不提供'IA'的原因是:人们可能会为A提出自己的随机实现并与系统一起玩。确定。让我把实际问题放在这里。 我正在开发一个Web应用程序。我们有几层--Dao,Doamin,Service,Web。 服务层通过DAO在域对象上提供各种服务。 我们有域对象 - Wire和WireRequest。 WireRequest可以包含任意数量的Wire。对应于这些域对象,我们有两个服务 - WireService和WireRequestService。 使用spring。在WireRequestService中注入WireService。
当我们将service.jar暴露给客户端时,他们可以独立使用WireService并创建没有WireRequest对象的Wire对象。我们想要防止这种情况。基本上我们想控制对某些服务的访问。 (我们可以通过授权弹簧方面做到这一点,但想使用一些OO方式)
-Nayn
答案 0 :(得分:1)
做最简单的事情。
除非我遗漏了某些内容,否则隐藏“聚合对象”的实现细节或类的任何其他属性本身并非“非OO”。
正如肯尼亚所说的那样,标记A类internal
(或者用你的语言中的等价物),它将不会从外界看到。您的类上的集合属性可以是protected
(或其他),然后在该类之外不会显示。
某些语言,例如.NET,也提供“内部类”:
public class X
{
internal class A
{
}
protected IEnumerable<A> ACollection { get; set; }
}
这里,A在X外部是不可见的。
答案 1 :(得分:0)
为什么不保护A的所有方法和属性?
答案 2 :(得分:0)
让我看看我是否理解正确;重新解决问题,你有容器X,它包含从A派生的A实例 - 但是为了使X只有A的实例,你将它限制为只包含A而不是IA的类型。我做对了吗?
对我来说,这实际上很好。您正在定义一个可以在编译期间加强的约束。将接口IA仅用于其他目的仍然有效 - 您可能需要另一个具有IA定义的行为的对象列表;通过接口IA为多态性等传递对象引用仍然很有用。
唯一的缺陷是系统已关闭 - 列表只能采用类型A.如果下次需要同时将A和B保存在同一列表中,但接下来不是C,该怎么办? (假设所有都来自IA)。在这种情况下添加适当的数据/状态验证要好得多,而不是限制为一种类型。
答案 3 :(得分:0)
根据A的复杂程度以及X的相对复杂性(或简单性),听起来您所描述的可能是Facade Pattern或Wrapper / Adapter Pattern
对于给定的一组场景,它们都是完全有效的,并且通常有助于在域/子域边界之间保持清晰。
编辑:鉴于OP最近添加了...而且听起来像“如何在使用弹簧和代码注入时控制对WireService和Wire的访问......”
我不熟悉春天以及如何注入东西 但是如果它遵循任何理智的库创建规则,它应该只需要你希望消费者必须公开的那些东西......所以你应该能够将WireServiceRequester作为唯一的公共对象。为其他所有内容提供他们实现的公共接口,并在任何具体实现类之前删除 public 。
如果弹簧不像我假设的那样理智,那么你可能最安全地使用弹簧内置的访问控制机制......
答案 4 :(得分:0)
public service.jar应该只包含接口类,并且应该通过某种IoC获得实现
在这种情况下,使用spring动态绑定实现
因此service.jar应该包含
仅限WireRequestServiceInterface