首页 > 解决方案 > 用于限制对 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 中的角色调用的方法数组?

标签: 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,和。READUPDATEDELETE


推荐阅读