这几天在看一些代理的东西.发现这个帖子写的很不错
冒昧转过来收藏之.
摘自 http://www.blogjava.net/lusm/archive/2007/08/08/135355.html
----------------------------------------------------------------
在以后的日子里,我会用学习剩下的时间和大家一起学习Java设计模式,书写有误之处,还望指正!谢谢!
我们的模式之旅,从这里开始
(注意:模式讲解过程会涉及到spring,struts,hibernate,jsf的一些东西,因为我相信这样做是有益的 呵呵)
代码一
日志实现的一般方法:
import
java.util.logging.
*
;
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
class
HelpSpeaker
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] name)
{
HelpSpeaker help=new HelpSpeaker();
Logger logger=
Logger.getLogger(help.getClass().getName());
//方法执行开始时留下记录
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
System.out.println("Hello");
//方法执行完毕前留下记录
logger.log(Level.INFO,"hello method ends
");
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
}
这样写的好处是简单,当我们的代码量不多的时候,呵呵 这样写无疑是首选。
这样写,我们必须在每个代码里都写上这些内容,当我们的代码量多起来的时候,比如,100个代码里面需要记录日志,想想需要多大的工作量,再想想,但我们在想在日志里添加一些内容的时候,或者需要去掉或分类管理的话,那有多乱,这样重复而无聊的工作,是多么另人望而生畏!!!
代码二
由于这种做法的局限性 不合理性 于是出现了代理;下面我介绍下我代码中的角色和对象:
/**/
/*
*电脑批发商
**/
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
interface
Computer
{
public void buy(String name);
}
/**/
/*
*联想电脑公司
**/
public
class
Lianxiang
implements
Computer
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
public void buy(String name)
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
{
System.out.println(name+" 联想电脑公司产品!");
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
1
/**/
/*
2
*三星电脑公司
3
**/
4
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
class
Sanxing
implements
Computer
{
5![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
6![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
public void buy(String name)
{
7
8
System.out.println(name+" 三星电脑公司产品!");
9
}
10![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
11
}
/**/
/*
*电脑销售代理商
**/
import
java.util.logging.Level;
import
java.util.logging.Logger;
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
class
ComputerProxy
implements
Computer
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
private Logger logger=
Logger.getLogger(this.getClass().getName());
private Computer computer;
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
public ComputerProxy(Computer helpObject)
{
this.computer=helpObject;
}
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
public void buy(String name)
{
//方法执行开始时留下记录
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
computer.buy(name);
//方法执行完毕前留下记录
logger.log(Level.INFO,"hello method ends
");
}
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
private void log(String msg)
{
logger.log(Level.INFO,msg);
}
/**/
/*
*买电脑的客户 有两个
**/
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
class
BuyComputer
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] args)
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
ComputerProxy proxy = new ComputerProxy(new Lianxiang());
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
proxy.buy("我想买一台联想电脑");
ComputerProxy proxy1 = new ComputerProxy(new Sanxing());
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
proxy1.buy("我想买一台三星电脑");
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
执行结果:
我想买一台联想电脑 联想电脑公司产品!
我想买一台三星电脑 三星电脑公司产品!
2007
-
8
-
8
21
:
01
:
27
com.lusm.spring.ComputerProxy buy
信息: hello method starts
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
2007
-
8
-
8
21
:
01
:
28
com.lusm.spring.ComputerProxy buy
信息: hello method ends
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
2007
-
8
-
8
21
:
01
:
28
com.lusm.spring.ComputerProxy buy
信息: hello method starts
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
2007
-
8
-
8
21
:
01
:
28
com.lusm.spring.ComputerProxy buy
信息: hello method ends
很明显,我们在main里的代码非常之少,而且可以通过(一个或者多个)批发商改变很多,代理内容,比如,批发商可以加一些附加的服务(送网线,送鼠标....),代码之间通过接口减低了程序块间的偶合性;下面让我们分析一下,代码是怎么工作的?
代码分析:
仔细看完代码我们知道客户买电脑是怎么一个过程:
用户找到代理商buy一台自己想要买的电脑,通过这两个语句,代理商知道用户想要买什么牌子的电脑
//
想买联想电脑
ComputerProxy proxy
=
new
ComputerProxy(
new
Lianxiang());
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
想买三星电脑
ComputerProxy proxy1
=
new
ComputerProxy(
new
Sanxing());
然后代理商根据用户的需要,找到电脑批发商Computer(注意:由于代理商和批发商之间并没有继承关系extends ,只是充当一个批发代理的角色implements,提醒一句,在Java里面,我们完全可以把接口看成角色,把类看成角色的表现实体--对象)
private
Computer computer;
问批发商说:“里面这里有没有两种电脑,一种叫联想的电脑,一种叫三星电脑”
public
ComputerProxy(Computer helpObject)
{
this.computer=helpObject;
}
批发商看了看自己手上的货单说:“有啊!我找两台给你!”
public
void
buy(String name)
{
//方法执行开始时留下记录
logger.log(Level.INFO,"hello method starts
");
//程序的主要功能
computer.buy(name);
//方法执行完毕前留下记录
logger.log(Level.INFO,"hello method ends
");
}
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
private
void
log(String msg)
{
logger.log(Level.INFO,msg);
}
我看到,代理商业是个在经营方面,非常用心的人,在工作的时候总是带一个笔记
private
Logger logger
=
Logger.getLogger(
this
.getClass().getName());
在买的时候就用log方法把整个买个过成记录下来。