代理

来源:互联网 发布:楚乔传网络播放量 编辑:程序博客网 时间:2024/04/28 08:55


什么是代理呢?

我们在平常生活中经常会遇到代理,比如说火车票代售点,比如说话费充值店等,这些代理都能帮助我们完成想要完成的事,去火车站售票厅买票、去营业厅缴费这些直接能办成的事我们可能有各种原因不能去办,那么就只能找代理了,反正代理也能办成。

很显眼Java中的代理也具备这个功能。

但是目的相同,都解决了核心问题,但是,一点区别都没有吗?从代理商那里买真的一点好处都没有吗?

那么问题来了:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理等等,如何去做?
解答:编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。

那么代理在程序中是怎么使用的呢?


上图中使用代理的优点就是:如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类、还是代理类,这样以后很容易切换,例如,想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。

那么代理在程序中怎么操作呢?

示例如下:

/*第一步:定义一个Italk接口  接口*/  interface ITalk {      public void talk(String msg);  }  /*第二步:定义人类实现Itqalk接口  People类实现ITalk接口 */class People implements ITalk{      public String userName;      public String age;           public People(String userName, String age){          this.userName = userName;          this.age = age;      }  //set get方法    public String getUserName(){          return userName;      }      public void setUserName(String userName){          this.userName = userName;      }         public String getAge(){          return age;      }      public void setAge(String age){          this.age = age;      }      @Override      public void talk(String msg) {          System.out.println(msg+"您好,我是"+userName+",我今年"+age+"岁.");      }       } /*第三步:写代理类,注入Italk接口代理类 */class TalkProxy implements ITalk{      ITalk talker;          public TalkProxy(ITalk talker){          this.talker = talker;      }      @Override      public void talk(String msg) {          talker.talk(msg);      }         public void talk(String msg, String singleName){          talker.talk(msg);          sing(singleName);      }      public void sing(String singleName){          System.out.println("唱歌:"+singleName);      }  }  /*第四步:编写代理类测试类代理测试类 */public class MyProxyText {      public static void main(String[] args) {          People people1 = new People("zhangsan", "24");              people1.talk("没有代理的测试Test");                 System.out.println("------------------------------------");                 People people2 = new People("lisi", "25");  //让people2经过代理        TalkProxy talker = new TalkProxy(people2);            talker.talk("有代理的测试", "你是我的小苹果");      }  }  

打印输出结果:


AOP概念

问题引入:
系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:
             安全       事务        日志
StudentService     ———|——————|——————|—————       

CourseService      ———|——————|——————|—————        
MiscService        ———|——————|——————|—————          
用具体的程序代码描述交叉业务:
method1         method2          method3
{              {                {
------------------------------------------切面
....            ....              ......
------------------------------------------切面
}              }                }

交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,如下所示:

----------------------------------------切面


  func1          func2            func3


  {             {                {


   ....           ....               ....


  }             }                }
  -----------------------------------------切面

使用代理技术正好可以解决这种交叉业务模块化的问题,代理是实现AOP功能的核心和关键技术。安全,事务,日志等功能要贯穿到好多个模块中,所以,它们就是交叉业务。
1 0