java - 用于限制对 Java 中方法的访问的设计模式
问题描述
我有一个这样的用户类:
public class User
{
public double userId;
public Role userRole;
....
}
角色是这样的枚举:
enum Role
{
ADMIN,
REGISTERED,
UNREGISTERED
}
我有一个名为 UserActions 的类,它是这样的:
public class UserActions
{
private User user;
public UserActions(User user){ this.user = user; }
public void Create(){...}
public void Read(){...}
public void Update(){...}
public void Delete(){...}
}
现在,显然,用户是否能够使用 Create、Read、Update 或 Delete 取决于他们的角色。最幼稚的做法是在所有基于 user.role 的方法中使用 Guard 子句,但这绝对不优雅,而且会污染业务逻辑。
我想做的是这样的:
public class UserActions
{
private User user;
public UserActions(User user){ this.user = user; }
public ArrayList<Lambdas> allowedActions() { return a list of allowed actions for the user which they can then invoke}
private void Create(){...}
private void Read(){...}
private void Update(){...}
private void Delete(){...}
}
有没有办法返回用户可以根据他们在 Java 中的角色调用的方法数组?
解决方案
看下面的方法。我认为您几乎可以找到解决方案,只需使用Function
而不是内联方法。我认为它应该工作。
class UserActions {
private final Function<Context, Result> create = context -> Result.NULL;
private final Function<Context, Result> read = context -> Result.NULL;
private final Function<Context, Result> update = context -> Result.NULL;
private final Function<Context, Result> delete = context -> Result.NULL;
private User user;
public UserActions(User user) {
this.user = user;
}
public List<Function<Context, Result>> allowedActions() {
// TODO read credentials and provided allowed actions here
return List.of(create, read, update, delete);
}
public static final class Context {
// TODO add action's input data here
}
public static final class Result {
public static final Result NULL = new Result();
// TODO read action's result here
}
}
我认为客户端应该识别不同的方法,然后List
你可以为每个操作提供一个唯一的键,Map
例如CREATE
,和。READ
UPDATE
DELETE
推荐阅读
- unity3d - Unity 3D 音频噼啪作响
- data-structures - 二叉树C#中的级别顺序插入
- javascript - 在 html、javascript 中导入 Python
- json - JPA 实体 JSON 序列化导致 StackOverflow
- javascript - 在 firebase 实时数据库中使用数组搜索
- php - 在 PHP 中使用 RSA/ECB/PKCS1Padding 加密数据
- google-people-api - people API 调用者没有权限错误
- python - 使用 python 请求进行 Web 抓取的 JWT 不记名授权
- c++ - 在 std::unique_ptr 下移动值
- python - 无法使用 selenium python 获取所有 foodpanda 商店名称