Architektura projektu

0

Witam, mam pytanie dotyczące architektury. Mam Klase ClientModel w którym tworze instancje Menager która zajmuję sie odtwarzaniem muzyki , pobieraniem muzyki (Klasa connect).
W momencie gdy chce pobrać np liste utworów z serwera pobieram instancje getInstance() z Klasy connect która implementuje Runnable.

public class Menager {

    //Client Model
    ClientModel clientModel;

    // Connection to server
    Connect connect;

    AdvancedPlayer advancedPlayer;

    LinkedList<Song> songList = new LinkedList<>();
    Song song;

    public Menager()
    {

    }

    public void initialization()
    {
        connect= Connect.getInstance();
    }

    public void setClientModel(ClientModel clientModel) {
        this.clientModel = clientModel;
    }

    private void getSongsList()
    {
        connect.getSongsList();
    }

}
public class Connect implements  Runnable{

    static Connect connect;

    Socket connection ;
    String address ="127.0.0.1";
    int port =55555;

    Thread th;
    InputStream inputStream;
    OutputStream outputStream;

    String query;

    private Connect()
    {
    }

    public static Connect getInstance()
    {
        if(connect ==null)
        {
            connect = new Connect();
        }

        return connect;
    }

    private void initialization(){
        connection= new Socket();
    }

    public LinkedList<Song> getSongList()
    {

        query="GetSongsList";
        Request();
        while(th.isAlive());                                  // Tutaj.
      return  songList;                              
    }                     
    private void Request()      
    {                                      
        th = new Thread(this);                    
        th.start();

    }

    private void ConnectToServer()        
    {
        try{
            TimeUnit.SECONDS.sleep(1);
            connection = new Socket(address,port);
        } catch (IOException e)
        {
            System.out.println("Server is not able");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

       while(!connection.isConnected())
       {
           ConnectToServer();
       }
        if(connection.isConnected())
        {
            System.out.println("You are Connected");

            try {
                inputstream =connection.getInputStream();           // Tutaj wyśle tego query 
                outputstream =   connection.getOutputStream();     // Pobierze dane ze serwera      
            }catch (IOException e)
            {
                System.out.println(e);
            }
        }

    }
}

Tutaj pojawia się problem, Menager wywołuje tą metodę
Ta metoda tworzy nowy wątek który łączy się z serwerem
pobiera obiekty(To dopiero dopisze) i dodaje do songList uzyskane dane.

  1. Strasznie ten While kluje mnie w oczy bo w sumie Menager musi czekać aż
    connect uzyska dane ze serwera , Czy jest jakaś możliwość inaczej to rozwiązać
    zamiast th.isAlive wiem że mogę dać boolean kiedy wątek będzie miał gotową odpowiedz.
    1. Co w sytuacji gdy bym chciał mieć wiele rodzajów zapytań(Wiele metod typu getSongList) ? Jak tworzyć taką architekturę klas ,metod.
  2. Jakieś porady projektowe, w jaki sposób zaprojektować taką aplikacje (mam tu na myśli klasy , referencje, metody) zanim usiądzie się do pisania
    Najbardziej cenne porady -> Programowanie zgodne ze Sztuką
1

wzorzec obserwator...?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0