public class Talker
{
private IMessageReceiver receiver;
private IMessageSender sender;
public Talker(IMessageReceiver receiver, IMessageSender sender)
{
this.receiver = receiver; this.sender = sender;
}
public Talker()
{
this.receiver = new MessageReceiver();
this.sender = new MessageSender();
}
// 事件轉發
public event MessageReceivedEventHandler MessageReceived
{
add { receiver.MessageReceived += value; }
remove { receiver.MessageReceived -= value; }
}
public event ClientConnectedEventHandler ClientConnected
{
add { receiver.ClientConnected += value; }
remove { receiver.ClientConnected -= value; }
}
public event ConnectionLostEventHandler ClientLost
{
add { receiver.ClientLost += value; }
remove { receiver.ClientLost -= value; }
}
public event PortNumberReadyEventHandler PortNumberReady
{
add { ((MessageReceiver)receiver).PortNumberReady += value; }
remove { ((MessageReceiver)receiver).PortNumberReady -= value; }
}
public bool ConnectByHost(string host, int port)
{
IPAddress[] ips = Dns.GetHostAddresses(host);
return sender.Connect(ips[0], port);
}
public bool ConnectByIp(string ip, int port)
{
if (!IPAddress.TryParse(ip, out IPAddress addr)) return false;
return sender.Connect(addr, port);
}
public bool SendMessage(Message msg) => sender.SendMessage(msg);
public void Dispose() { try { sender.SignOut(); receiver.StopListen(); } catch { } }
public void SignOut() { try { sender.SignOut(); } catch { } }
}
Talker 封裝收發介面,透過事件轉發與方法委派達成解耦,未來更換實作無須修改 UI 程式碼。