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