Наследование Java Как дифференцировать тип пользователя в программе? - PullRequest
0 голосов
/ 03 октября 2018

Итак, я создаю систему с логином, который дает пользователю различные опции в зависимости от типа пользователя.

например enter image description here

Мне интересно, как я должен сделать систему различать два при входе в систему.Должен ли я предоставить классу пользователя проверку логического типа для каждого типа пользователя?

, например, booleanUser1Check () и booleanUser2Check ()

или атрибут idType.

Что такоелучший способ сделать это с точки зрения упс?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Если вы посмотрите на существующие структуры авторизации, вы заметите, что ни одна из них не использует полиморфизм для определения ограничений контроля доступа.Вместо этого каждый пользователь представлен экземпляром того же класса, и у экземпляра есть свойства, которые определяют права доступа пользователя.Эти свойства часто называют ролями и представляют реальные человеческие роли, такие как администратор, пользователь, руководитель отдела продаж и т. Д.

В большинстве систем пользователь может даже иметь несколько ролей, например, если пользователь является «разработчиком»и «менеджер» одновременно.

Это позволяет создавать неограниченное количество комбинаций ролей в файлах конфигурации.С полиморфным подходом вы должны определить каждый в коде.Необходимость менять код и делать релиз каждый раз, когда меняются роли пользователей, значительно увеличивает ваши затраты на обслуживание.

0 голосов
/ 03 октября 2018

Интересный способ достичь того, чего вы хотите, - это воспользоваться полиморфизмом , то есть способностью объекта принимать различные формы.Помимо прочего, эта функция позволяет ссылочной переменной родительского класса ссылаться на экземпляр одного из его дочерних классов.Ниже вы узнаете, как это сделать.

Создайте абстрактный класс, который определит структуру по умолчанию для всех пользователей:

public abstract class User
{
    private String name;
    private String email;

    //...
    //perform an action that must have a different behaviour for each user type
    public abstract void doSomething();
}

Обратите внимание, что вы можете объявлять как абстрактные, так и неабстрактные методы.там.Теперь создайте класс для каждого типа пользователя:

public class Admin extends User
{
    //...
    @Override
    public void doSomething() {
       //action's behaviour for an admin
    }
}

public class NormalUser extends User
{
    //...
    @Override
    public void doSomething() {
       //action for a normal user
    }
}

public class PremiumUser extends User
{
    //...
    @Override
    public void doSomething() {
       //action for a premium user
    }
}

Помните, что все классы, которые расширяет User, должны реализовывать свои абстрактные методы (doSomething() в этом случае).Теперь, если вам действительно нужно знать тип пользователя, используйте оператор instaceof , чтобы проверить, содержит ли переменная типа User экземпляр одного из перечисленных выше классов.См. Пример ниже:

User user = ...
if(user instanceof NormalUser) {
    //user is a normal user
} 
//...

Обратите внимание, однако, что лучше и более объектно-ориентированный дизайн будет иметь родительский класс для обработки общих действий, необходимых для пользователя, и позволить дочерним классам заполнятьв специфике .В приведенном выше примере все пользователи могут выполнять действие, определенное doSomething(), но это действие отличается для каждого пользователя.Поскольку каждый тип пользователя реализует этот метод по-своему, вы можете использовать его без необходимости знать, какой тип является пользователем.

Таким образом, вы инкапсулируете поведение в User и его подклассах, так что код, используемый для разных пользователей, одинаков, хотя их поведение отличается.Смотрите ниже:

User user = ...
user.doSomething(); //perform different actions depending on the user's type. Notice that you do not need to know what type the user is in this case
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...