您的位置:首页 > 编程语言 > Java开发

转个经典的帖子:说故事学设计模式之-Java静态代理模式

2009-03-26 22:26 627 查看
 这几天在看一些代理的东西.发现这个帖子写的很不错
冒昧转过来收藏之.
摘自 http://www.blogjava.net/lusm/archive/2007/08/08/135355.html
----------------------------------------------------------------
在以后的日子里,我会用学习剩下的时间和大家一起学习Java设计模式,书写有误之处,还望指正!谢谢!

我们的模式之旅,从这里开始

(注意:模式讲解过程会涉及到spring,struts,hibernate,jsf的一些东西,因为我相信这样做是有益的 呵呵)

代码一

日志实现的一般方法:


import java.util.logging.*;






public class HelpSpeaker 

{






    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 

 

");




    }


}

这样写的好处是简单,当我们的代码量不多的时候,呵呵 这样写无疑是首选。

      这样写,我们必须在每个代码里都写上这些内容,当我们的代码量多起来的时候,比如,100个代码里面需要记录日志,想想需要多大的工作量,再想想,但我们在想在日志里添加一些内容的时候,或者需要去掉或分类管理的话,那有多乱,这样重复而无聊的工作,是多么另人望而生畏!!!

代码二

由于这种做法的局限性 不合理性 于是出现了代理;下面我介绍下我代码中的角色和对象:




/**//*


*电脑批发商


**/




public interface Computer 

{


    public void buy(String name);


}
 




/**//*


*联想电脑公司


**/


public class Lianxiang implements Computer






{




    public void buy(String name) 




    

{


      System.out.println(name+"  联想电脑公司产品!");


    }




}
 

 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) 

{


           


        //方法执行开始时留下记录


        logger.log(Level.INFO,"hello method starts 

 

");


        


        //程序的主要功能


        computer.buy(name);


        


        


        //方法执行完毕前留下记录


        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("我想买一台联想电脑");


        


        ComputerProxy proxy1 = new ComputerProxy(new Sanxing());




        proxy1.buy("我想买一台三星电脑");




    }




}



执行结果:


我想买一台联想电脑  联想电脑公司产品!


我想买一台三星电脑  三星电脑公司产品!


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里的代码非常之少,而且可以通过(一个或者多个)批发商改变很多,代理内容,比如,批发商可以加一些附加的服务(送网线,送鼠标....),代码之间通过接口减低了程序块间的偶合性;下面让我们分析一下,代码是怎么工作的?

代码分析:

仔细看完代码我们知道客户买电脑是怎么一个过程:

    用户找到代理商buy一台自己想要买的电脑,通过这两个语句,代理商知道用户想要买什么牌子的电脑


//想买联想电脑


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




//想买三星电脑


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 

 

");


    }




private void log(String msg)

{


        logger.log(Level.INFO,msg);


    }

我看到,代理商业是个在经营方面,非常用心的人,在工作的时候总是带一个笔记


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

在买的时候就用log方法把整个买个过成记录下来。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息