Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
1

Паттерн Команда

08.02.2014, 01:26. Показов 2510. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!

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

Introduction:
Разрабатывается клиент для ftp-сервера в консольном виде. Программа на стороне клиента получает запрос от юзера и начинает парсить запрос:
К примеру возьмем вот такой запрос: connect localhost 21
Дальше строка сплитится через пробелы и ожидается, что первая строка в массиве строк будет именем команды - все остальное параметрами команды, причем параметров может и не быть, а могут идти в объязательном порядке(SendToServerCommand к примеру)

Есть интерфейс Command->execute(): void;
Есть реализация ConnectCommand->execute(): void - как мне передать в execute() параметры? Я не могу в интерфейсе Command изменить метод execute(String[] args) - потому что есть другие команды-пустышки, которые ничего в аргументы не должны принимать. Так же команда ConnectCommand в методе execute должна произвести инициализацию соединения, то бишь открыть соединение по сокету по 21 порту и настроить входные и выходные потоки для данного приложения в целом. Как это реализовывать?
Т.е. вариант который у меня сейчас реализован он в корне не верен, поскольку в метод передается не только массив строк, но и ссылка на класс, содержащий объекты классов потоков

И вообще реализация у меня в корне не верна, как Вы можете видеть ниже:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class FtpClientModel implements Model {
    private Controller controller;
    private Socket controlConnection;
    private InputStreamReader controlInput;
    private OutputStreamWriter controlOutput;
    private int CACHE_SIZE = 64*1024;
    private boolean activeControlConnection;
    private boolean activeDataConnection;
//Дальше много хард-кода
 
// Вот метод с которого начинается парсинг юзерского запроса
    @Override
    public void executeUserCommand() {
        try{
            String command = this.controller.getUserCommand();
            this.controller.getView().clearCommandLine();
            if(command.isEmpty())
                return;
            
            this.controller.getView().showInformationMessage(command);
            String[] words = command.split(" ");
            
            String type = words[0].toLowerCase();
            if("o".equals(type) || "connect".equals(type)){
                try {
// Че за нах!
                    new Connect().execute(this, words);
                    this.controller.getView().showServerResponce(getServerResponce());
                } catch (CommandException e) {
                    this.controller.getView().showErrorMessage(e.getMessage());
                }
                return;
            } 
            if("exit".equals(words[0].toLowerCase())){
                this.exit();
                return;
            }
            if("cls".equals(type) || "clear".equals(type)){
                this.clearMessageArea();
                return;
            }
            
            sendToServer(command);
            String responce = getServerResponce();
            this.controller.getView().showServerResponce(responce);
        } catch(IOException e){
            this.controller.getView().showErrorMessage(e.getMessage());
        }
    }
Вот имплементация интерфейса Command - ConnectionCommand
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Connect implements Command {
    @Override
    public void execute(Model model, String[] args) throws CommandException {
        Controller controller = model.getController();
        try {
            if(args == null || args.length != 3)
                throw new CommandException("Wrong arguments");
            
            Socket ss = model.getControlConnection();
            
            if (ss != null && ss.isConnected()) {
                ss.close();
            }
            int port = Integer.parseInt(args[2]);
            String host = args[1];
            controller.getView().showInformationMessage(
                    "Connection " + host + " " + port);
            try {
                ss = new Socket(host, port);
            } catch (IOException e) {
                throw new CommandException("Connection failed!");
            }
            model.setControlConnection(ss);
            model.setIn(new InputStreamReader(ss.getInputStream()));
            model.setOut(new OutputStreamWriter(ss.getOutputStream(),
                    "iso-8859-1"));
            controller.getView().showInformationMessage(
                    "Connected to " + host + ":" + port);
            model.setActiveControlConnection(true);
        } catch (IOException e) {
            throw new CommandException(e.getMessage());
        }
    }
}




Вот структура проекта, если кому нужно
Кликните здесь для просмотра всего текста
Паттерн Команда
Паттерн Команда


Не по теме:


Не по теме:



На знание MVC
Вот так вообще можно делать?

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(new AluminiumLookAndFeel());
        
            Controller controller = new SimpleController();
            Model model = new FtpClientModel(controller);
            View view = new Terminal(controller);
            
            controller.setModel(model);
            controller.setView(view);
            
            view.start();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }
}

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2014, 01:26
Ответы с готовыми решениями:

Паттерн Command
Добрый вечер. Наткнулся на такой паттерн, говорят его нужно использовать если в классе много...

Паттерн стратегия
Всем привет. Решил разобраться с паттерном стратегия, прочитал несколько статей и сделал по их...

Паттерн Singleton
Здравствуйте! Подскажите пожалуйста как тут можно реализовать паттерн Singleton? Классы: ...

Составить паттерн
Делаю запрос на vkapi, Дабы не тянуть доп. библиотеку json ради одного ответа, надо составить...

3
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.02.2014, 01:49 2
проще пример сложно придумать
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * @author mutagen
 */
public class CommandDemo {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new ComandProcessor().doCommand(new Mycommand(100));
    }
    
    static class ComandProcessor {
        public void doCommand(Command command) {
            command.execute();
        }
    }
 
    static class Mycommand implements Command {
 
        private int param;
 
        public Mycommand(int param) {
            this.param = param;
        }
 
        @Override
        public void execute() {
            System.out.println("param is: " + param);
        }
 
    }
 
    private static interface Command {
 
        void execute();
    }
}
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
08.02.2014, 08:25  [ТС] 3
Цитата Сообщение от mutagen Посмотреть сообщение
проще пример сложно придумать
Спасибо. Я одно только не могу уяснить: а на **га так? Что я не мог в методе парсинга написать так
Java
1
new MyCommand(params).execute();
Что я получаю с этого?
И что я не получаю?

В общем плюсы и минусы данного паттерна, если можно
0
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.02.2014, 13:37 4
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Что я получаю с этого?
например вам отправляет команду плагин или клиентское приложение, что за действия там будут произведены, ваш сервер не знает, но знает одно что надо вызвать метод execute(), и ему этого достаточно чтобы выполнить команду

например в моём примере ComandProcessor может находиться на сервере, а MyCommand ему прилетело с интернета по RMI

остальное долго обьяснять, проще почитать книжку про паттерны Design Patterns - Gang of Four
1
08.02.2014, 13:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2014, 13:37
Помогаю со студенческими работами здесь

Паттерн Visitor
Написал приложение для работы с бд. тема - кулинарная книга. 5 таблиц, можно добавить-удалить...

Паттерн декоратор
Паттерн декоратор - это когда мы создаем производный класс от базового класса и внутри методов...

Паттерн State
Покажите пожалуйста простой, понятный пример с использованием паттерна состояния на java. В...

Паттерн Factory Method
Помогите доделать задачу. Используя шаблон проектирования Factory Method подготовить код на языке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru