【发布时间】:2016-04-05 21:44:54
【问题描述】:
众所周知,在很多OO程序语言中,我们可以使用一些访问修饰符来指定对象内部字段的访问范围。
例如,在 java 中,我们可以使用 public、protected 或 private 来指定一个字段的访问范围,用于该对象的所有调用者。
但我的问题是,我想为不同的调用者指定被调用者的不同访问权限。
最重要的一点是:调用者类可以由其他程序员编写,但是我的主程序编写完成后,他们无法通过自己的实现更改权限。
例如,假设国际象棋游戏程序中至少有 3 个实体,1 个棋盘和 2 个棋手,我想让黑方棋手对棋盘上的所有棋具有“读取”权限,但只是“移动”访问所有黑棋的访问权限,(只有在轮到他的时候才拥有“移动”权限),反之亦然。
我已经有了以下一些想法,但是这些想法似乎太复杂了,并不理想。
那么有什么好的方法、设计模式,或者其他的东西来处理这个问题吗?
非常感谢
//=============================================== ===================
我的想法:
1.使用访问密钥类。
- 创建一个类“访问密钥”。
- 使用“游戏主机”类将“密钥”实例分配给不同的玩家。
- 棋盘类实例有一个键权映射表。
- 每次玩家向 board,它必须将它们的键实例作为参数提供给方法, 如果权限被拒绝,则抛出异常。
2.使用中介控制器类
- 棋盘中有一个内部类“boardcontroller”。
- 2个棋盘控制器子类,1个可以下白棋,另一个可以下黑棋。
(虽然我可以在这个子类中使用一些if-else来决定它是否可以移动一些国际象棋,但我想让玩家类由其他程序员编写,让他们编写他们的AI,所以这些子类使用的权限判断流程不能直接在播放器类中作为我的问题的一种方法。)
- 将子板控制器实例分配给不同的播放器。
3.低级方法(丑陋且不理想)
在board类的“move”或“read”方法中,查看线程的callstack,知道调用者是否属于“player”类,是哪边(黑或白)。
//=============================================== =======================
有更好的主意吗?谢谢你
【问题讨论】:
-
没有必要成为一些“设计模式”的东西,只要一个好的方法或技巧就可以了。
-
考虑为此使用代理?
标签: java design-patterns acl access-rights