close
This tutorial is about proxy pattern, which is my thoghts after watching the tutorial created by Christopher Okhravi.
-
Virtual Proxy
-
Remote Proxy
-
Protection Proxy
Virtual Proxy:
IBookParser portion:
1: interface IBookParser
2: {3: int getNumPages();
4: }BookParser portion:
1: class BookParser : IBookParser
2: {3: string book;
4: public BookParser(String _book)
5: {6: this.book = _book;
7: } 8: 9: public int getNumPages()
10: {11: return Convert.ToInt32(book);
12: } 13: }LazyBookParser portion:
1: class LazyBookParser : IBookParser
2: {3: private IBookParser parser = null;
4: private string book;
5: public LazyBookParser(string _book)
6: {7: this.book = _book;
8: } 9: 10: public int getNumPages()
11: {12: if (this.parser == null)
13: parser = new BookParser(this.book);
14: return this.parser.getNumPages();
15: } 16: }Console portion:
1: static void Main(string[] args)
2: {3: string book = "1234";
4: LazyBookParser lazyBookParser = new LazyBookParser(book);
5: Console.WriteLine("{0}",lazyBookParser.getNumPages());
6: Console.ReadKey(); 7: }Remote Proxy
Now we are going to introduce an application of proxy pattern, which has two parts: client and server portions.
IActualPrices portion
1: namespace ActualPriceLib
2: {3: public interface IActualPrices
4: {5: string GoldPrice { get; }
6: string SilverPrice { get; }
7: string DollarToRupee { get; }
8: } 9: }TCPClient Project
IClient portion:
It is an interface that describes a client side must have following methods, including
Connect to server, Close connection, Disconnect to server, send a message, and receive response from server.
1: public interface IClient
2: {3: void Connect();
4: void Close();
5: void Disconnect();
6: void SendMessage(string cmd);
7: string ReceiveData();
8: }IClient portion:
Then Client class implements all methods of IClient as follows
1: public class Client : IClient
2: {3: bool bConnected = false;
4: TcpClient client = null;
5: string ipAddress = "127.0.0.1";
6: int nPort = 9999;
7: string response = string.Empty;
8: public Client(string _ipAddress, int _nPort)
9: {10: this.ipAddress = _ipAddress;
11: this.nPort = _nPort;
12: } 13: 14: public void Connect()
15: { 16: if (client == null) client = new TcpClient();
17: while (!client.Connected)
18: {19: try
20: { 21: client.Connect(ipAddress, nPort); 22: }23: catch(Exception ex)
24: {25: Console.WriteLine("server connection failed");
26: } 27: } 28: 29: //while (!client.Connected)
30: bConnected = client.Connected; 31: }32: public void Close()
33: {34: if (client.Connected) client.Close();
35: }36: public void Disconnect()
37: {38: if(client!=null) client.Dispose();
39: client = null;
40: }41: public string ReceiveData()
42: {43: string result = string.Empty;
44: Stream stream = client.GetStream(); 45: 46: const int len = 100;
47: byte[] br = new byte[len];
48: int k = stream.Read(br, 0, len);
49: 50: for (int i = 0; i < k; i++)
51: { 52: result += Convert.ToChar(br[i]); 53: } 54: Close(); 55: Disconnect();56: return result;
57: }58: public void SendMessage(string cmd)
59: {60: if (!bConnected) Connect();
61: Stream stream = client.GetStream(); 62: 63: 64: 65: ASCIIEncoding asen = new ASCIIEncoding();
66: byte[] ba = asen.GetBytes(cmd.ToCharArray());
67: stream.Write(ba, 0, ba.Length); 68: 69: } 70: }In order to provide another way to send message from client to server, we build a static class named ClientFactory.
ClientFactory portion:
1: public static class ClientFactory
2: {3: public static Client client = null;
4: public static string SendMessage(string input)
5: { 6: client = CreateClient(); 7: client.Connect(); 8: client.SendMessage(input); 9: return client.ReceiveData();
10: }11: private static Client CreateClient()
12: {13: if (client == null) client = new Client("127.0.0.1", 9999);
14: return client;
15: } 16: }Now we are going to introduce ClientActualPrices class, which inherits IActualPrices
ClientActualPrices portion:
1: using TCPClient;
2: namespace ActualPriceLib
3: {4: class ClientActualPrices : IActualPrices
5: {6: public string GoldPrice
7: { 8: get 9: {10: return ClientFactory.SendMessage("g");
11: } 12: }13: public string SilverPrice
14: { 15: get 16: {17: return ClientFactory.SendMessage("s");
18: } 19: }20: public string DollarToRupee
21: { 22: get 23: {24: return ClientFactory.SendMessage("d");
25: } 26: } 27: } 28: }ClientActualPricesProxy portion:
1: public class ClientActualPricesProxy : IActualPrices
2: {3: ClientActualPrices actualPrices = new ClientActualPrices();
4: 5: public string GoldPrice
6: { 7: get 8: {9: return actualPrices.GoldPrice;
10: } 11: } 12: 13: public string SilverPrice
14: { 15: get 16: {17: return actualPrices.SilverPrice;
18: } 19: } 20: 21: public string DollarToRupee
22: { 23: get 24: {25: return actualPrices.DollarToRupee;
26: } 27: } 28: }ClientConsole portion:
1: static void Main(string[] args)
2: {3: IActualPrices proxy = new ClientActualPricesProxy();
4: 5: Console.WriteLine("Gold Price: {0} ", proxy.GoldPrice);
6: Console.WriteLine("Silver Price: {0}", proxy.SilverPrice);
7: Console.WriteLine("Dollar to Ruppe Conversion: {0}", proxy.DollarToRupee);
8: 9: 10: Console.ReadKey(); 11: }IServer portion:
1: public interface IServer
2: {3: void Start();
4: }ServerActualPrices portion:
1: public class ServerActualPrices : IActualPrices
2: {3: public string GoldPrice
4: { 5: get 6: {7: // This value should come from a DB typically
8: return "100";
9: } 10: } 11: 12: public string SilverPrice
13: { 14: get 15: {16: // This value should come from a DB typically
17: return "5";
18: } 19: } 20: 21: public string DollarToRupee
22: { 23: get 24: {25: // This value should come from a DB typically
26: return "50";
27: } 28: } 29: }ServerActualPricesProxy portion:
1: public class ServerActualPricesProxy:IActualPrices
2: {3: ServerActualPrices serverActualPrices = new ServerActualPrices();
4: 5: public string GoldPrice
6: { 7: get 8: {9: return serverActualPrices.GoldPrice;
10: } 11: } 12: 13: public string SilverPrice
14: { 15: get 16: {17: return serverActualPrices.SilverPrice;
18: } 19: } 20: 21: public string DollarToRupee
22: { 23: get 24: {25: return serverActualPrices.DollarToRupee;
26: } 27: } 28: }Server portion:
1: public class Server:IServer
2: {3: TcpListener listener = null;
4: string ipAddress = "127.0.0.1";
5: int nPort = 9999;
6: Dictionary<string, string> actualPrices = new Dictionary<string, string>();
7: Dictionary<string, string> actualPricesInfo = new Dictionary<string, string>();
8: public Server(string _ipAddress, int _nPort)
9: {10: this.ipAddress = _ipAddress;
11: this.nPort = _nPort;
12: }13: private void InitPrices()
14: {15: if(actualPrices.Count == 0)
16: {17: IActualPrices proxy = new ServerActualPricesProxy();
18: actualPrices.Add("g", proxy.GoldPrice);
19: actualPrices.Add("s", proxy.SilverPrice);
20: actualPrices.Add("d", proxy.DollarToRupee);
21: }22: if(actualPricesInfo.Count == 0)
23: {24: actualPricesInfo.Add("g", "Gold Prices");
25: actualPricesInfo.Add("s", "Silver Price");
26: actualPricesInfo.Add("d", "Dollar To Rupee Prices");
27: } 28: }29: public void Start()
30: { 31: InitPrices();32: IPAddress ip = IPAddress.Parse(this.ipAddress);
33: this.listener = new TcpListener(ip, this.nPort);
34: while (true)
35: { 36: listener.Start();37: Console.WriteLine("Waiting .....");
38: Socket s = listener.AcceptSocket(); 39: 40: byte[] b = new byte[100];
41: 42: int count = s.Receive(b);
43: 44: string input = string.Empty;
45: 46: for (int i = 0; i < count; i++)
47: { 48: input += Convert.ToChar(b[i]); 49: } 50: 51: string returnValue = string.Empty;
52: string message = string.Empty;
53: returnValue = actualPrices[input]; 54: 55: ASCIIEncoding asen = new ASCIIEncoding();
56: s.Send(asen.GetBytes(returnValue)); 57: 58: s.Close(); 59: listener.Stop();60: Console.WriteLine("Response for ({0}) Sent .....", actualPricesInfo[input]);
61: } 62: } 63: }Console portion:
1: static void Main(string[] args)
2: { 3: ServerFactory.CreateServer().Start(); 4: 5: }
References:
全站熱搜







留言列表
