Тема: актор 0.*
Показать сообщение отдельно

  #1  
Старый 30.01.2017, 04:29
gattsu
Участник форума
Регистрация: 24.11.2015
Сообщений: 165
С нами: 5509192

Репутация: 1457
По умолчанию

Нашел более менее оптимальный вариант, проектирование систем на основе акторов, в java.

Для простоты и прозрачности, логики, все поведение програмируется внутренними классами.

Реализовал базовый набор по Hewitt-у, во время обработки сообщения, актор может:

- отправлять сообщения другим акторам и самому себе(рекурсивное сообщение) (метод Context.send и Reference.send)

- менять свое поведения (метод Context.become)

- создавать других акторов (метод Context.create)

О поведении актора, на основе просто примере будет более наглядно:

Цитата:
Сообщение от Спойлер  


Код:


Код:
package fact.samples;

import fact.Context;

public class Account implements Context {
    final String login;
   
    final String password;
   
    Account(String login, String password) {
        this.login = login;
        this.password = password;
    }
   
    public void define() {
        become("Free");
    }
   
    public void logout() {
        System.out.println("wrong logout");
    }
   
    public class Free {
       
        public void login(String login, String password) {
            if(Account.this.login.equals(login) && Account.this.password.equals(password)) {
                System.out.println("login success");
                become("Login");
            } else
                System.out.println("wrong login or password");
        }
       
    }
   
    public class Login {
       
        public void login(String login, String password) {
            System.out.println("account in use");
        }
       
        public void logout() {
            System.out.println("logout");
            become("Free");
        }
    }
}
В данном коде, есть актор Account, у которого, есть два поведения(внутренних класса) Free и Login. У каждого из них есть, свои обработчики сообщений.

Если расширить данный пример, можно реализовать актор для сервера авторизации.

Замечание: если пришло сообщение, которого нету в заданном поведение, то метод для обработки сообщения ищеться в базов классе. В данном примере, если отправить сообщение logout, когда актор установлен как Free, будет вызван обработчик из базового класса Account, на экран консоли, выведиться сообщение "wrong logout"

Пример использования:

Цитата:
Сообщение от Спойлер  


Код:


Код:
package fact.samples;

import fact.Context;
import fact.Model;
import fact.Reference;

public class AccountSample implements Context {

    public void define() {
        Reference account = create("account", new Account("root", "root"));
        account.send("logout");
        account.send("login", "root", "1243");
        account.send("login", "root", "root");
        account.send("login", "root", "root");
        account.send("logout");
        account.send("logout");
        account.send("login", "root", "root");
    }
   
    public static void main(String...args) {
        Model.launch(new AccountSample());
    }
   
}
console output:

Код:


Код:
wrong logout
wrong login or password
login success
account in use
logout
wrong logout
login success
 
Ответить с цитированием