public class Calculator { public int Add(int x, int y) { return x + y; } } 這個(gè)類再簡(jiǎn)單不過(guò)了,不過(guò)若你將它想象為一個(gè)可能更復(fù)雜的業(yè)務(wù)處理類的時(shí)候,你將面臨除了核心功能實(shí)現(xiàn)之外的更多處理細(xì)節(jié),比如說(shuō):權(quán)限控制、審計(jì)日志、性能監(jiān)測(cè)、緩沖處理、事務(wù)環(huán)境等等。為簡(jiǎn)單起見(jiàn),我們首先為該類增加記錄日志的功能,該功能要求將對(duì)每個(gè)方法的調(diào)用和處理結(jié)果輸出到Console中,如下:
public class Calculator { public int Add(int x, int y) { Console.Write("Add({0},{1})", x, y); int result = x + y; Console.WriteLine(" = {0}", result); return result; } } 再簡(jiǎn)單不過(guò)了,對(duì)吧?現(xiàn)在我們需要為該方法實(shí)現(xiàn)性能監(jiān)測(cè),如下:
public class Calculator { public int Add(int x, int y) { Console.Write("Add({0},{1})", x, y); DateTime TimeBegin = System.DateTime.Now; int result = x + y; TimeSpan TimeInter =System.DateTime.Now-TimeBegin; Console.Write(" [{0}] ", TimeInter); Console.WriteLine(" = {0}", result); return result; } } 此時(shí)你已經(jīng)感覺(jué)到,雖然我們實(shí)現(xiàn)了所需的功能,但是在一個(gè)方法中堆疊了處理各類事宜的不同代碼。雖然在這個(gè)簡(jiǎn)單例子中不會(huì)感覺(jué)有什么不爽,但是請(qǐng)你想象一下假如我們將為該類添加第二個(gè)方法時(shí)會(huì)發(fā)生什么事情:
public class Calculator { public int Add(int x, int y) { Console.Write("Add({0},{1})", x, y); DateTime TimeBegin = System.DateTime.Now; int result = x + y; TimeSpan TimeInter =System.DateTime.Now-TimeBegin; Console.Write(" [{0}] ", TimeInter); Console.WriteLine(" = {0}", result); return result; } public int SuBTract(int x, int y) { Console.Write("Subtract({0},{1})", x, y); DateTime TimeBegin = System.DateTime.Now; int result = x - y; TimeSpan TimeInter =System.DateTime.Now-TimeBegin; Console.Write(" [{0}] ", TimeInter); Console.WriteLine(" = {0}", result); return result; } } 在兩個(gè)方法中已經(jīng)明顯出現(xiàn)重復(fù)代碼了,這可不是一個(gè)好的解決辦法——想想一下假如我們的計(jì)算器有10個(gè)方法呢?假如我們還有類似于計(jì)算器類的另外數(shù)十個(gè)類呢?假如我們還有更多的方法級(jí)功能要實(shí)現(xiàn)呢(權(quán)限控制、事務(wù)治理……)?在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,這可是一個(gè)經(jīng)常會(huì)遇的問(wèn)題。為清楚起見(jiàn),我們將問(wèn)題分解成兩部分,首要的問(wèn)題是代碼職責(zé)混淆,其次則是同樣的代碼邏輯反復(fù)多次——這些問(wèn)題都將導(dǎo)致開(kāi)發(fā)治理、代碼編寫與維護(hù)的各種困難。
方案一:自己手動(dòng)編寫代理解決
1、首先 我們定義接口ICalculator:
using System; namespace PRoxy { public interface ICalculator { int Add(int x, int y); int Subtract(int x, int y); } } 2、具體實(shí)現(xiàn)一個(gè)接口:
using System; namespace Proxy { public class Calculator:ICalculator { public virtual int Add(int x, int y) { int result = x + y; return result; } public virtual int Subtract(int x, int y) { int result = x - y; return result; } } } QQread.com 推出各大專業(yè)服務(wù)器評(píng)測(cè) linux服務(wù)器的安全性能 SUN服務(wù)器 HP服務(wù)器 DELL服務(wù)器 IBM服務(wù)器 聯(lián)想服務(wù)器 浪潮服務(wù)器 曙光服務(wù)器 同方服務(wù)器 華碩服務(wù)器 寶德服務(wù)器 3、編寫增加日志和性能檢測(cè)功能的代理類