1

私は6つの異なるクラスに分けたサーバープロジェクトを持っています:

  • ServerConnectionManager - このクラスは、他のすべてのクラスのハブになることができます
  • 接続 - このオブジェクトは、クライアントが接続し、スレッドを開始するたびに作成されます
  • ServerListner - これは、ユーザーからの入力をリッスンする Thread クラスです。
  • ServerSender - これは、1 人以上のユーザーにメッセージを送信するクラスです
  • ServerInformation - このクラスには、チャット担当者の 1 つと接続の 1 つの 2 つのリストが含まれます。このクラスでは、リストを検索して特定の人物や接続を見つけることもできます
  • ChatPerson - このオブジェクトには、サーバーに接続する各ユーザーのユーザー名が含まれます

お察しのとおり、これはチャット プログラム用のサーバーです。

あなたへの私の質問は次のとおりです。

このプロジェクトでデザイン パターン (Mediator) を使用したいので、ServerConnectionManager には、各クラスが使用するすべての主要なメソッドが含まれています。たとえば、ServerInformation クラスの接続リストに接続を追加します。

しかし、ServerInformation クラスは、多くのメソッド (関数) しかなく、データの保存と検索以外の実際の目的がないため、オブジェクトと呼ぶことはできないため、静的にすることをお勧めしますか? または、計画に固執して、すべてが ServerConnectionManager を通過するようにする必要がありますか?

これが私のコードのサンプルです:

ServerConnectionManager

public class ServerConnectionManager {

    private static ServerSocket server;
    private static Socket connection;
    private static ServerInformation ai = new ServerInformation();
    private static boolean connected = false;
    private static final int portNumber = 7070;
    private static int backLog = 100;

    /**
     * This method launches the server (and the application)!
     * @param args
     */
    public static void main(String[] args){
        startServer();
        waitForConnection();
    }


    /**
     *This method sets the serverSocket to portNumber and also adds the backLog.
     */
    private static void startServer() {
        try {
            server = new ServerSocket(portNumber, backLog);
            connected = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * This method waits for a connection aslong as the serverSocket is connected.
     * When a new client connects it creates an Object of the connection and starts the individual procedure.
     */
    private static void waitForConnection() {
        while (connected) {
            try {
                connection = server.accept();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Connection c = new Connection(connection);
            addConnection(c);
            waitForConnection();
        }

    }


    public static void closeMe(Socket con) {
        for (Connection conn : ai.getConnectionList()) {
            if (conn.getConnection() == con) {
                ai.getList().remove(ai.getList().indexOf(ai.getChatPersonByConnection(con)));
                ai.getConnectionList().remove(conn);

                System.out.println(ai.getList());
                System.out.println(ai.getConnectionList());
                conn.close();
                break;

            }
        }

    }
    public static void addConnection(Connection con){
        ai.addToConnectionList(con);

    }
    public static void addChatPerson(ChatPerson p){
        ai.add(p);
        System.out.println(ai.getList());
    }



}

繋がり

public class Connection{
    private Socket connection;
    public Connection(Socket connection){
        this.connection = connection;
        ServerListner cl = new ServerListner(Connection.this);
        cl.start();
    }
    public Socket getConnection(){
        return this.connection;
    }
    public void close() {
        try {
            connection.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


}

サーバーリスナー

public class ServerListner extends Thread {

    private Socket connection;
    private BufferedReader br;
    private ChatPerson person;
    private Connection con;
    private ServerInformation ai = new ServerInformation();
    private ServerSender sender = new ServerSender();

    public ServerListner(Connection con){
        this.con = con;
        connection = con.getConnection();
        try {
            br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public Socket getConnection(){
        return this.connection;
    }
    public void run(){
        System.out.println(con.getConnection().isConnected());
            try {
                String inString;
                while ((inString = br.readLine()) != null) {
                    if (inString.equalsIgnoreCase("Disconnect")) {
                        System.out.println(inString);
                        break;
                    }else {
                        processInput(inString);
                    }
                }
                ServerConnectionManager.closeMe(connection);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    public void processInput(String input){
        if (input.equalsIgnoreCase("Connect")) {
            sender.sendMessageToConnection(this.connection, "Accepted");
        }
        if (input.equalsIgnoreCase("UserInformation")) {
            try {
                String username = br.readLine();
                person = new ChatPerson(username, connection);
                ServerConnectionManager.addChatPerson(person);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (input.equalsIgnoreCase("SearchByCon")) {
            String name = ai.searchByConnection(connection);
            System.out.println(name);
        }

    }
}

サーバー送信者

public class ServerSender {
    private PrintWriter pw;
    private ServerInformation ai = new ServerInformation();

    public void addToList(){

    }
    public void sendToAll(String message){
        for (Connection c : ai.getConnectionList()) {
            try {
                pw = new PrintWriter(c.getConnection().getOutputStream());
                pw.print(message);
                pw.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
    /** 
     *
     * @param con
     * @param message
     */

    /*
     * Note - Denne metode gør også at jeg kan hviske til folk!:)
     */
    public void sendMessageToConnection(Socket con, String message){
        try {
            PrintWriter print = new PrintWriter(con.getOutputStream());
            print.println(message);
            print.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

サーバー情報

public class ServerInformation{
    private ArrayList<Connection> connectedClients = new ArrayList<Connection>();
    private ArrayList<ChatPerson> list = new ArrayList<ChatPerson>();


    public ArrayList<Connection> getConnectionList(){
        return connectedClients;
    }
    public void addToConnectionList(Connection con){
        connectedClients.add(con);
    }
    public String searchByConnection(Socket myConnection){
        for (ChatPerson p : list) {
            if (p.getConnection() == myConnection) {
                return p.getName();
            }   
        }
        /*
         * If none found!
         */
        return null;
    }

    public ChatPerson getChatPersonByConnection(Socket myConnection){
        for (ChatPerson p : list) {
            if (p.getConnection() == myConnection) {
                return p;
            }
        }
        return null;
    }

    public void add(ChatPerson p){
        list.add(p);
    }

    public void removeByName(String name){
        for (ChatPerson p : list) {
            if (p.getName().equalsIgnoreCase(name)) {
                list.remove(p);     
            }
        }
    }
    public String searchList(String name){
        for (ChatPerson p : list) {
            if (p.getName().equalsIgnoreCase(name)) {
                return p.getName();
            }
        }
        return null;
    }   
    public ArrayList<ChatPerson>getList(){
        return list;
    }

}

チャットパーソン

public class ChatPerson {
    private String chatName;
    private Socket connection;

    /*
     * This is for furture development
     * private Integer adminLevel;
     */

    public ChatPerson(String name, Socket connection){
        this.chatName = name;
        this.connection = connection;
    }
    public void setName(String name){
        this.chatName = name;

    }
    public String getName(){
        return chatName;

    }
    public String toString(){
        return "Username: "+chatName;
    }
    public Socket getConnection(){
        return connection;
    }
}

ちなみに、私は学生なので、私のコードを評価し、改善方法についての提案があればいいと思います(もしあれば:))

4

1 に答える 1

2

おそらく、静的クラスではなく、静的メソッドのみを持つクラスを意味していました。静的内部クラスは別のものです (Google で検索できます)。

マネージャに非静的メソッドを含める利点:

  • テスト中に Mockito のようなフレームワークを使用して簡単にモックできます。
  • コードのリファクタリング中に、それらを何らかのインターフェイスにプルアップできます。
  • 静的メソッドの使用はオブジェクト指向プログラミングではありません。そのようなメソッド呼び出しはクラスのインスタンス (オブジェクト) に関連付けられていないからです。
于 2012-11-17T01:54:40.520 に答える