Как показать только вид интерфейса в Java - PullRequest
0 голосов
/ 28 октября 2011

Можно ли показать только определенный вид интерфейса или приблизить это поведение в Java?Например:

public interface SecureDevice
{
   bool connectWith( SecureDevice d ); // visible to people who have a SecureDevice object
   bool connectWith( SecureDevice d, Authentication a ); // somehow only visible to classes with permission
}

Я бы хотел, чтобы пользователи интерфейса SecureDevice не знали, что для взаимодействия требуется аутентификация или даже существует класс Authentication.Им не нужно знать детали.Им нужно только знать, что взаимодействие либо произошло, либо нет.Например, пользователь, получивший два объекта SecureDevice, может попробовать это:

public void establishConnection(SecureDevice d1, SecureDevice d2 )
{

    Connector c = new Connector();

    if( false == d1.connectWith( d2 ) )
    {
        System.out.println("Couldn't connect to directly");
    }
    else if ( false == c.connect( d1, d2 ) )
    {
        System.out.println("Couldn't connect using Connector.");
    }
 }

, но я мог бы определить класс следующим образом:

public class Computer implements SecureDevice
{
    private Authentication auth;

    public bool connectWith( SecureDevice d )
    {
        return d.connectWith(d, auth);
    }

    private? bool connectWith(SecureDevice d, Authorization a)
    {
        // check the authorization, do whatever it takes to connect, etc.
    }
}

или аналогично

public class Connector 
{
    private Authentication myAuth;

    public bool connect(SecureDevice a, SecureDevice b)
    {
        a.connectWith(b, myAuth);
    }

}   

Этот пример похож на друзей в C ++, но я чувствую, что он немного другой.Я не хочу давать специального разрешения на использование метода.

Я хотел бы иметь два интерфейса в составе SecureDevice:

   public interface SecureDevice
   {
       public interface UserView
       {
           connectWith(SecureDevice d);
       }

       public interface LibraryView
       {
           connectwith(SecureDevice d, Authentication a);
       }
    }

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

Итак, для простоты, я просто хочу представить пользователю простой интерфейс, содержащий только те методы, которые ему нужны, и ни одно из дел, в которых он не нуждается.Как я могу сделать (или приблизительный) это?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 октября 2011

В Java вы не можете контролировать доступ к отдельным методам, используя простой интерфейс.С другой стороны, вы можете контролировать доступ к методам в интерфейсе EJB, где только пользователи с авторизованными ролями могут вызывать метод - конечно, каждый клиентский класс будет видеть открытые методы, но только авторизованные пользователи смогут успешно вызывать их

1 голос
/ 28 октября 2011

Нет.Если вы должны представить интерфейс без аутентификации, то это то, что должно быть в этом интерфейсе.

Вы можете расширить интерфейс, но у вас возникнет аналогичная проблема.

Другой вариант будетпринять реализацию чего-то, что выполняет реальную работу, конструкция которого содержит подробности реализации, очень примерно:

открытый интерфейс SecurableDevice {public boolean connectWith (Connector);}

открытый класс SecurableConnector реализует Connecter {public SecurableDeviceConnector (SecureDevice sd) {...} открытый void connectWith (d1) {...}}

открытый класс SecurableDeviceConnector реализует Connector {public SecurableDeviceConnector(SecureDevice sd, Авторизация a) {...} public void connectWith (d1) {...}}

Установление соединения удалено из SecurableDevice;устройство вызывает connectWith, и оно там обрабатывается.

Реализации Connector могут предоставляться только тем пользователям, которые в них нуждаются.

...