Вам выше предложили много хороших вариантов, лично я бы использовал все-таки банальный IF
это самый "дешевый" и простой вариант, и не нужно боятся что у вас будет рости количество кейсов, которые вы будете так же решать, ведь количество вариантов приложения вряд ли будет сильно расти.
Мой опыт таков: я пишу кроссплатформенные приложения, и у меня в коде переодически нужно дергать разное нативное АПИ, поэтому приходится вставлять if OS_ANDROID, if OS_IOS и т.п. никаких проблем или неудобств не испытываю. А в оверинжиниринге нет ничего хорошего.
В дополнение дополню еще одним вариантом(именно из разряда перемудрить):
ACL
т.е. вместо IF в коде
у вас будет один метод, вначале какого-то "ограниченного" вызова:
openView = function(viewName, params) {
try {
acl.checkAccess(user/system/status/type_of_app) // бросает эксепшен, поэтому можно удобно втыкать где угодно
rootView = new View()
if acl.hasAccess("pay_app")
rootView.add(new Button("HD Quality"))
....
} catch (ACLException e) {
if (e.code = ACL_PAYMENT_CODE) {
showUserMessage("Это премиум контент, вам необходимо купить ... ")
} else {
...
}
}
}
дальше варианты на свой вкус,
например если авторизация не прошла, то метод бросит эксепшн
или джаваскрипт стайл, завернуть это в промис, или анонимную функцию
и например в зависимости от этих проверок рисоваться будет интерфейс, запускаться функции, лиснеры
единственно, чтобы этим делом управлять хоть "на лету" или "из админки", нужно будет организовать "секьюрити матрицу", грубо говоря такого типа:
_____________________| BUTTON_1 | VIEW_1 | VIEW_LOADING |
user_1(admin)............| default | enable | default
user_2...........................| hidden | default | default
pay_app.......................| default | enable | default
free_app......................| default | disable | default
status_loading..........| default | default | show
На мой взгляд - это не лучший вариант, это для проектов с большим количеством сущностей такое внедняют. Но может натолкнет на интересные мысли.