這幾天在看一些代理的東西.發(fā)現(xiàn)這個帖子寫的很不錯
冒昧轉過來收藏之.
摘自 http://m.tkk7.com/lusm/archive/2007/08/08/135355.html
----------------------------------------------------------------
在以后的日子里,我會用學習剩下的時間和大家一起學習Java設計模式,書寫有誤之處,還望指正!謝謝!
我們的模式之旅,從這里開始
(注意:模式講解過程會涉及到spring,struts,hibernate,jsf的一些東西,因為我相信這樣做是有益的 呵呵)
代碼一
日志實現(xiàn)的一般方法:
import java.util.logging.*;


public class HelpSpeaker
{


public static void main(String[] name)
{
HelpSpeaker help=new HelpSpeaker();
Logger logger=
Logger.getLogger(help.getClass().getName());
//方法執(zhí)行開始時留下記錄
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
System.out.println("Hello");
//方法執(zhí)行完畢前留下記錄
logger.log(Level.INFO,"hello method ends
");

}
}
這樣寫的好處是簡單,當我們的代碼量不多的時候,呵呵 這樣寫無疑是首選。
這樣寫,我們必須在每個代碼里都寫上這些內容,當我們的代碼量多起來的時候,比如,100個代碼里面需要記錄日志,想想需要多大的工作量,再想想,但我們在想在日志里添加一些內容的時候,或者需要去掉或分類管理的話,那有多亂,這樣重復而無聊的工作,是多么另人望而生畏!!!
代碼二
由于這種做法的局限性 不合理性 于是出現(xiàn)了代理;下面我介紹下我代碼中的角色和對象:

/**//*
*電腦批發(fā)商
**/

public interface Computer
{
public void buy(String name);
}

/**//*
*聯(lián)想電腦公司
**/
public class Lianxiang implements Computer


{

public void buy(String name)

{
System.out.println(name+" 聯(lián)想電腦公司產品!");
}

}
1
/**//*
2
*三星電腦公司
3
**/
4
public class Sanxing implements Computer
{
5
6
public void buy(String name)
{
7
8
System.out.println(name+" 三星電腦公司產品!");
9
}
10
11
}

/**//*
*電腦銷售代理商
**/
import java.util.logging.Level;
import java.util.logging.Logger;


public class ComputerProxy implements Computer
{

private Logger logger=
Logger.getLogger(this.getClass().getName());
private Computer computer;

public ComputerProxy(Computer helpObject)
{
this.computer=helpObject;
}

public void buy(String name)
{
//方法執(zhí)行開始時留下記錄
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
computer.buy(name);
//方法執(zhí)行完畢前留下記錄
logger.log(Level.INFO,"hello method ends
");
}

private void log(String msg)
{
logger.log(Level.INFO,msg);
}

/**//*
*買電腦的客戶 有兩個
**/

public class BuyComputer
{


public static void main(String[] args)
{

ComputerProxy proxy = new ComputerProxy(new Lianxiang());

proxy.buy("我想買一臺聯(lián)想電腦");
ComputerProxy proxy1 = new ComputerProxy(new Sanxing());

proxy1.buy("我想買一臺三星電腦");

}

}

執(zhí)行結果:
我想買一臺聯(lián)想電腦 聯(lián)想電腦公司產品!
我想買一臺三星電腦 三星電腦公司產品!
2007-8-8 21:01:27 com.lusm.spring.ComputerProxy buy
信息: hello method starts

2007-8-8 21:01:28 com.lusm.spring.ComputerProxy buy
信息: hello method ends

2007-8-8 21:01:28 com.lusm.spring.ComputerProxy buy
信息: hello method starts

2007-8-8 21:01:28 com.lusm.spring.ComputerProxy buy
信息: hello method ends

很明顯,我們在main里的代碼非常之少,而且可以通過(一個或者多個)批發(fā)商改變很多,代理內容,比如,批發(fā)商可以加一些附加的服務(送網(wǎng)線,送鼠標....),代碼之間通過接口減低了程序塊間的偶合性;下面讓我們分析一下,代碼是怎么工作的?
代碼分析:
仔細看完代碼我們知道客戶買電腦是怎么一個過程:
用戶找到代理商buy一臺自己想要買的電腦,通過這兩個語句,代理商知道用戶想要買什么牌子的電腦
//想買聯(lián)想電腦
ComputerProxy proxy = new ComputerProxy(new Lianxiang());

//想買三星電腦
ComputerProxy proxy1 = new ComputerProxy(new Sanxing());
然后代理商根據(jù)用戶的需要,找到電腦批發(fā)商Computer(注意:由于代理商和批發(fā)商之間并沒有繼承關系extends ,只是充當一個批發(fā)代理的角色implements,提醒一句,在Java里面,
我們完全可以把接口看成角色,把類看成角色的表現(xiàn)實體--對象)
private Computer computer;
問批發(fā)商說:“里面這里有沒有兩種電腦,一種叫聯(lián)想的電腦,一種叫三星電腦”

public ComputerProxy(Computer helpObject)
{
this.computer=helpObject;
}
批發(fā)商看了看自己手上的貨單說:“有啊!我找兩臺給你!”

public void buy(String name)
{
//方法執(zhí)行開始時留下記錄
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
computer.buy(name);
//方法執(zhí)行完畢前留下記錄
logger.log(Level.INFO,"hello method ends
");
}

private void log(String msg)
{
logger.log(Level.INFO,msg);
}
我看到,代理商業(yè)是個在經(jīng)營方面,非常用心的人,在工作的時候總是帶一個筆記
private Logger logger=Logger.getLogger(this.getClass().getName());
在買的時候就用log方法把整個買個過成記錄下來。
呵呵! 大家,我的故事講完了!希望大家用心體會,有什么問題請留言!謝謝您的支持!!!