【发布时间】:2019-10-17 19:32:15
【问题描述】:
所以,这是我的设计。 AccessDecorator 类引用另一个 Access 就像普通的装饰器模式一样。
但问题是当我创建一个 AccessDecorator 包装一个 ConcreteAccess 然后尝试查看 Access 是哪种类型时:
Access access = new InAllowedAccess();
Access wrapperAccess = new MismatchAccess(access);
if (wrapperAccess instanceof InAllowedAccess) //this condition could be used to be a predicate for a filtering over an access list for example
//do something
这当然行不通,因为wrapperAccess 不是InAllowedAccess 类型但我真正想知道的是一些Access 的所有类型。 在这种情况下, wrapperAccess 不仅是 MismatchAccess 类型,而且也是 InAllowedAccess 类型
我考虑在Access 类中实现isInstanceofInAllowed()、isInstanceofOutAllowed()、isInstanceofInDenied() 和isinstanceofOutDenied()、isinstanceofMismatch() 等方法,但似乎不是一个好的解决方案,我不知道...
否则我应该为InAllowedMismatchAccess、OutAllowedMismatchAccess、InDeniedMismatchAccess 和OutDeniedMismatchAccess 的每 4 种类型创建一个带有MismatchAccesses 的大层次树吗?然后,当我开发另一个装饰器时?...
或者还有其他更好的设计吗?
我如何知道Access 的所有类型?不仅是封装访问的类型,还有封装访问的类型。
编辑:
我的一个需求是:按类型过滤Accesses 的集合——ÌnAllowedAccess、InDeniedAccess、OutAllowedAccess、OutDeniedAccess、MismatchAccess(这是一个装饰器)和我其他类型的装饰器可能会发展
【问题讨论】:
-
装饰器模式依赖于多态性。测试对象的类型不是多态性。使用 Access 的代码应该使用它,而不必知道和关心对象的实际类型:它应该只调用接口中定义的方法,仅此而已。我们对这些类应该做什么知之甚少,因此很难比这更精确。
-
这很难解释,但谢谢。所以创建像
isInstanceofInAllowed(),...这样的方法也不好,对吧? -
不,不会的。
标签: java design-patterns instanceof decorator-pattern