代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式分为静态代理、动态代理。
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
就静态代理举个栗子
有两个人,有很多money的张三和24K纯屌丝李四,他们做着做同样的事情——惹上了官司和吃饭,张三就雇用专业的律师打官司,饭自己吃;李四雇不起律师,只好自己上,饭当然也是要自己吃……用静态代理实现如下
要做的事情(接口)
package com.hk.service;
/**
* 定义一个接口(一类人要做的事情)
* @author 浪丶荡
*
*/
public interface ISomeService {
public String Litigate();
public String eat();
}
如果自己做,做的方式是(目标类)
package com.hk.service;
/**
* 目标类
* @author 浪丶荡
*
*/
public class ISomeServiceImp implements ISomeService {
@Override
public String Litigate() {
return "自己打官司,输了";
}
@Override
public String eat() {
return "自己吃饭";
}
}
专业律师(代理类)
package com.hk.service;
/**
* 代理类
* @author 浪丶荡
*
*/
public class ServiceProxy implements ISomeService {
private ISomeService target;
public ServiceProxy() {
}
public ServiceProxy(ISomeService target) {
this.target = target;
}
@Override
public String Litigate() {
return "律师打官司,赢了";
}
@Override
public String eat() {
return target.eat();
}
}
演绎过程(测试类)
package com.hk.test
import com.hk.service.ISomeService
import com.hk.service.ISomeServiceImp
import com.hk.service.ServiceProxy
public class MyTest {
public static void main(String[] args) {
//有money人张三
ISomeService zhangsan = new ISomeServiceImp()
//屌丝李四
ISomeService lisi = new ISomeServiceImp()
//张三请的律师打官司,饭自己吃
ISomeService sp = new ServiceProxy(zhangsan)
System.out.println("zhangsan"+sp.Litigate()+"-----"+sp.eat())
//苦逼的李四自己打官司,自己吃饭
System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat())
}
}
结局(结果)
-----
-----