設計模式系列
代理模式:為其他物件提供一種代理,以控制對這個物件的存取。
使用時機:如果物件存取時間太長或重複存取次數太頻繁或可能根本不會
存取時使用。
用在那些地方:
1.遠程代理:透過不同地址空見的物件提供local的代理物件, EX:WebService
、在中間有一個WebReference。
2.虛擬代理:根據建立消耗的大資源物件,先建立一個小物件,等真實角色實
例化完成。EX:例如查詢時候,會先用Loading中、等待畫面給客
戶看,等載入完成後再實際顯示客戶。
3.保護代理:依照客戶的權限,來控制對真實角色的存取。
4.智能引用:當代理呼叫真實角色時,代理會做其他的功能,比如計算真實角
色被呼叫的次數。
5.快取代理:將真實角色的運算結果儲存在臨時的共同空間,多個客戶可以取
這些共同的結果。
優點:
1.透過真實角色完成商業邏輯,其他非它的職責代理完成。
2.當真實角色出現商業邏輯變化時,只要Subject的介面不變,Proxy不用修改
可以正常使用。
缺點:
1.客戶必須透過代理才能請求真實角色做事情,處理速度會變慢。
class Program
{
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
Console.ReadKey();
}
}
abstract class Subject
{
public abstract void Request();
}
class RealSubject:Subject
{
public override void Request()
{
Console.WriteLine("Called RealSubject.Request()");
}
}
class Proxy : Subject
{
private RealSubject realSubject;
public override void Request()
{
if (realSubject ==null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
來個案例運算
public class Program
{
private static void Main(string[] args)
{
MathProxy proxy = new MathProxy();
Console.WriteLine($"4 + 2 = {proxy.Add(4,2)}");
Console.WriteLine($"4 - 2 = {proxy.Sub(4,2)}");
Console.WriteLine($"4 * 2 = {proxy.Mul(4,2)}");
Console.WriteLine($"4 / 2 = {proxy.Div(4,2)}");
}
}
public interface IMath
{
double Add(double x, double y);
double Sub(double x, double y);
double Mul(double x, double y);
double Div(double x, double y);
}
public class Math : IMath
{
public double Add(double x, double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
public class MathProxy : IMath
{
private Math math = new Math();
public double Add(double x, double y)
{
return math.Add(x, y);
}
public double Sub(double x, double y)
{
return math.Sub(x, y);
}
public double Mul(double x, double y)
{
return math.Mul(x, y);
}
public double Div(double x, double y)
{
return math.Div(x, y);
}
}
元哥的筆記