這幾天在看一些代理的東西.發(fā)現(xiàn)這個帖子寫的很不錯
冒昧轉(zhuǎn)過來收藏之.
摘自 http://www.aygfsteel.com/lusm/archive/2007/08/08/135355.html
----------------------------------------------------------------
在以后的日子里,我會用學(xué)習(xí)剩下的時(shí)間和大家一起學(xué)習(xí)Java設(shè)計(jì)模式,書寫有誤之處,還望指正!謝謝!
我們的模式之旅,從這里開始
(注意:模式講解過程會涉及到spring,struts,hibernate,jsf的一些東西,因?yàn)槲蚁嘈胚@樣做是有益的 呵呵)
代碼一
日志實(shí)現(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í)行開始時(shí)留下記錄
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
System.out.println("Hello");
//方法執(zhí)行完畢前留下記錄
logger.log(Level.INFO,"hello method ends
");

}
}
這樣寫的好處是簡單,當(dāng)我們的代碼量不多的時(shí)候,呵呵 這樣寫無疑是首選。
這樣寫,我們必須在每個代碼里都寫上這些內(nèi)容,當(dāng)我們的代碼量多起來的時(shí)候,比如,100個代碼里面需要記錄日志,想想需要多大的工作量,再想想,但我們在想在日志里添加一些內(nèi)容的時(shí)候,或者需要去掉或分類管理的話,那有多亂,這樣重復(fù)而無聊的工作,是多么另人望而生畏!!!
代碼二
由于這種做法的局限性 不合理性 于是出現(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)想電腦公司產(chǎn)品!");
}

}
/*
*電腦銷售代理商
**/
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í)行開始時(shí)留下記錄
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í)行結(jié)果:
我想買一臺聯(lián)想電腦 聯(lián)想電腦公司產(chǎn)品!
我想買一臺三星電腦 三星電腦公司產(chǎ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ā)商改變很多,代理內(nèi)容,比如,批發(fā)商可以加一些附加的服務(wù)(送網(wǎng)線,送鼠標(biāo)....),代碼之間通過接口減低了程序塊間的偶合性;下面讓我們分析一下,代碼是怎么工作的?
代碼分析:
仔細(xì)看完代碼我們知道客戶買電腦是怎么一個過程:
用戶找到代理商buy一臺自己想要買的電腦,通過這兩個語句,代理商知道用戶想要買什么牌子的電腦
//想買聯(lián)想電腦
ComputerProxy proxy = new ComputerProxy(new Lianxiang());

//想買三星電腦
ComputerProxy proxy1 = new ComputerProxy(new Sanxing());
然后代理商根據(jù)用戶的需要,找到電腦批發(fā)商Computer(注意:由于代理商和批發(fā)商之間并沒有繼承關(guān)系extends ,只是充當(dāng)一個批發(fā)代理的角色implements,提醒一句,在Java里面,我們完全可以把接口看成角色,把類看成角色的表現(xiàn)實(shí)體--對象)
private Computer computer;
問批發(fā)商說:“里面這里有沒有兩種電腦,一種叫聯(lián)想的電腦,一種叫三星電腦”
public ComputerProxy(Computer helpObject){
this.computer=helpObject;
}
批發(fā)商看了看自己手上的貨單說:“有啊!我找兩臺給你!”
public void buy(String name) {
//方法執(zhí)行開始時(shí)留下記錄
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)營方面,非常用心的人,在工作的時(shí)候總是帶一個筆記
private Logger logger=Logger.getLogger(this.getClass().getName());
在買的時(shí)候就用log方法把整個買個過成記錄下來。
呵呵! 大家,我的故事講完了!希望大家用心體會,有什么問題請留言!謝謝您的支持!!!
冒昧轉(zhuǎn)過來收藏之.
摘自 http://www.aygfsteel.com/lusm/archive/2007/08/08/135355.html
----------------------------------------------------------------
在以后的日子里,我會用學(xué)習(xí)剩下的時(shí)間和大家一起學(xué)習(xí)Java設(shè)計(jì)模式,書寫有誤之處,還望指正!謝謝!
我們的模式之旅,從這里開始
(注意:模式講解過程會涉及到spring,struts,hibernate,jsf的一些東西,因?yàn)槲蚁嘈胚@樣做是有益的 呵呵)
代碼一
日志實(shí)現(xiàn)的一般方法:



























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


















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

2

3

4

5

6

7

8

9

10

11

























































執(zhí)行結(jié)果:


















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





然后代理商根據(jù)用戶的需要,找到電腦批發(fā)商Computer(注意:由于代理商和批發(fā)商之間并沒有繼承關(guān)系extends ,只是充當(dāng)一個批發(fā)代理的角色implements,提醒一句,在Java里面,我們完全可以把接口看成角色,把類看成角色的表現(xiàn)實(shí)體--對象)

問批發(fā)商說:“里面這里有沒有兩種電腦,一種叫聯(lián)想的電腦,一種叫三星電腦”



批發(fā)商看了看自己手上的貨單說:“有啊!我找兩臺給你!”



















我看到,代理商業(yè)是個在經(jīng)營方面,非常用心的人,在工作的時(shí)候總是帶一個筆記

在買的時(shí)候就用log方法把整個買個過成記錄下來。
呵呵! 大家,我的故事講完了!希望大家用心體會,有什么問題請留言!謝謝您的支持!!!