Padrão MVC - Classe controller - manipulação de Threads

2 respostas
Y

Boa noite pessoal.

Tenho praticado ultimamente o uso do MVC em java. Estava acostumado a fazer coisas básicas utilizando o framework CakePHP.

Gostaria de saber a opinião de vocês sobre a utilização de “componentes” nas classes controllers.

Por exemplo:
Tenho a classe ServidorController, nela espero a mensagem enviada pelo cliente e este tratamento da conexão gostaria de utilizar uma Thread (Servidor MultiThread).

Não gostaria de implementar ServidorController como Runnable pois ai teria que instanciar a mesma classe na hora da criação de Threads.
Então criarei uma nova classe Runnable que trata o envio e recebimento de mensagens.

Minhas dúvidas são:
1- Posso criar esta classe (a Runnable) como um component e instanciá-la dentro do ServidorController sem estar ferindo o design pattern?
2- Haveria uma melhor maneira de efetuar isso sem utilizar classes internas?

Se fosse o caso de criar uma classe Component iria criar um pacote interno dentro do pacote Controle chamado Componentes.
Quando me refiro a Component trata-se de classes que auxiliam as controladoras como seria no caso do CakePHP.
A classe ServidorController já é uma Thread mas preciso de outras.

Abaixo segue o código do Controller.A parte onde pretendo utilizar uma classe Runnable se encontra no método aceitar Conexões.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controle;

import Modelo.ServidorModel;
import Visao.ServidorView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Yuri
 */
public class ServidorController extends Thread{
   
    private ServidorModel modelo;
    private ServidorView  visao;
    private String configs[] = new String[3];
    private ServerSocket conexao;
    public boolean flag = false;
    
    public ServidorController(ServidorModel model, ServidorView view){
        this.modelo = model;
        this.visao = view;
        
        this.visao.addBotaoIniciarListener(new botaoIniciarListener());
        this.visao.addBotaoLimparListener(new botaoLimparListener());
        
        this.configs = this.modelo.obterConfiguracoes();
    }
    
    //Controle de Thread
    @Override
    public void run(){
        while(true)
        {
            if(flag){
                System.out.println("Server Aberto");
                this.aceitarConexoes();
            }
        }
    }
    
    
    //Manipulação de Sockets
    public void aceitarConexoes(){
        try { 
            
            /* Pretendo colocar o trecho abaixo em uma outra classe que será Runnable */
            
                    Socket cliente = this.conexao.accept();
                    DataInputStream entrada = new DataInputStream(cliente.getInputStream());
                    String mensagem = entrada.readUTF();
                        if(mensagem != null)
                            System.out.println(mensagem);
             /* Fim do trecho */          
                        
                        
                        
            } catch (UnknownHostException ex) {//Excessão host desconhecido
                 Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                if(flag)//Se a conexão deveria funcionar corretamente lança excessões
                 Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
            } 
    }
    
    public void abrirConexao(){
            try {
                conexao = new ServerSocket(Integer.parseInt(configs[1]));
            } catch (IOException ex) {
                Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
            }

    }
    
    public void fecharConexao(){
                try {
                    conexao.close();
                } catch (IOException ex) {
                    if (!flag)
                     Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
                }
    }
    
    
    //Listeners - Classes Internas 
    class botaoIniciarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent evt){
                
                if(visao.getBotaoIniciar().isSelected()){
                    flag = true;     
                    abrirConexao();
                    visao.getTextoTerminal().append("Servidor iniciado no ip " + configs[0] + " e porta " + configs[1] + ".\n");
                } 
                else{
                    flag = false;
                    fecharConexao();
                    visao.getTextoTerminal().append("Servido Finalizado...\n");
                }
        }
    }
    
    class botaoLimparListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent evt){
            visao.getTextoTerminal().setText(null);
        }
    }
}

Espero ter demonstrado minha dúvida.
Agradeço desde já.

Att,
Yuri

2 Respostas

Y

Alguém? :oops:

Y

Bom, já que não houve resposta,

Resolvi efetuar a seguinte organização:

Exemplo:

Package View
|_ ClasseView.java
|_Package Helpers
|_Mask.java

Package Controller
|_ClasseController.java
|_Package Components
|_ClasseComponent.java

Package Model
|_ClasseModel.java
|_Behaviors
|_ModelDao.java

Components, Helpers e Behaviors são classes que são ajudantes essenciais em seus respectivos pacotes.

Por exemplo: possuo um ServidorController e necessito de manipulação de Threads. Para não declarar uma infinidade de classes internas ou classes no mesmo pacote mas que não são controladoras utilizo uma Classe SocketsComponent do pacote Component.

Se alguém tiver uma sugestão, dúvida ou opinião… será bem vindo! ^^

Att,
Yuri

Criado 1 de abril de 2012
Ultima resposta 3 de abr. de 2012
Respostas 2
Participantes 1