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


    这几天在看一些代理的东西.发现这个帖子写的很不错
    冒昧转过来收藏之.
    摘自 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**/

     4public 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方法把整个买个过成记录下来。
     

    呵呵! 大家,我的故事讲完了!希望大家用心体会,有什么问题请留言!谢谢您的支持!!!

  • 相关阅读:
    金融数据获取的api接口
    股票实时数据接口
    【C#】通过webbrowser控件自动注册QQ号讲解
    【C#】通过webbrowser控件获取验证码
    光圈,快门, 曝光,焦距, ISO,景深。
    装修记录
    cocos2dx在win10系统上的VS2017运行时报错:丢失MSVCR110.dll
    论打击的本质(2)-视觉理论及应用篇
    论打击感的本质(1)——力的理论及应用
    android屏幕适配详解
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562427.html
Copyright © 2020-2023  润新知