介绍下静态代理,其实很简单就是甲代替乙去做一件事情,表面上看大家都认为是甲做的,其实是甲借助乙来完成的这件事情,只是大家看不到实质罢了,废话不多说,看个实际例子,有个类乙需要实现 增删改查功能 但是实现之后发现不完美,想要修改下,追加一些额外的工作,比如安全性检查、日志之类的(横切性问题)问题。

乙的接口如下:

package com.staticProxy;

/**
 * @author 
 *
 * 2012-10-17上午9:37:31
 */
public interface ManagerInterface {
 
 public void add();
 public void delete();
 public void modify();
 public String search();

}

接口的实现 乙为:

package com.staticProxy;

/**
 * @author 
 *
 * 2012-10-17上午9:38:26
 */
public class ManagerImpl implements ManagerInterface {

 public void add() {

  System.out.println("add");
 }

 public void delete() {

  System.out.println("delete");
 }

 public void modify() {

  System.out.println("modify");
 }

 public String search() {

  System.out.println("search");
  return "search=============================";
 }
}
现在想增加安全性检查,即调用此实现来实现增删改查的时候要有安全性验证,否则不能为其提供服务。但是此时这部分代码已经封板不能做任何改动,那怎么办呢?想想如果造出来一个路人甲来代替它,这样就可以在不改变乙的情况下来完成预期的目标了。

采用静态代理要与目标对象实现相同的接口,同样也有增删改查等操作,同时在每个操作中已经添加了相应的安全性检查的代码,查看下面代码发现采用了组合的方式,即 代理类持有目标对象的引用,通过构造方法给乙引用赋值。在代理类的增删改查操作中调用的还是原来乙的增删改查操作。代码如下:

package com.staticProxy;

/**
 * @author 
 *
 * 2012-10-17上午9:52:52
 */
public class ManagerStaticProxy implements ManagerInterface {
 
 ManagerImpl managerImpl;
 public ManagerStaticProxy(ManagerImpl managerImpl) {
  this.managerImpl = managerImpl;
 }

 public void add() {

  checkSecurity();
  managerImpl.add();
 }

 public void delete() {

  checkSecurity();
  managerImpl.delete();
 }

 public void modify() {

  checkSecurity();
  managerImpl.modify();
 }

 public String search() {

  checkSecurity();
  managerImpl.search();
  return "StaticProxySearch=====================";
 }
 public void checkSecurity(){
  System.out.println("checkSecurity==============================");
 }
}
这样客户端调用就可以达到设想的目标

package com.staticProxy;

/**
 * @author 
 *
 * 2012-10-17上午9:56:03
 */
public class Client {

 /**

  * @param args
  */
 public static void main(String[] args) {
  ManagerStaticProxy managerStaticProxy = new ManagerStaticProxy(new ManagerImpl());
  managerStaticProxy.add();
  managerStaticProxy.delete();
  managerStaticProxy.modify();
  System.out.println(managerStaticProxy.search());
 }

}

 

全部代码见附件