1:静态代理
- 抽象角色:声明真实对象和代理对象的共同接口,这样可在任何使用真实对象的地方都可以使用代理对象。
- 代理角色:代理对象内部含有真实对象的引用,从而可以在任何时候操作真实对象。代理对象提供一个与真实对象相同的接口,以便可以在任何时候替代真实对象。代理对象通常在客户端调用传递给真实对象之前或之后,执行某个操作,而不是单纯地将调用传递给真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 真实角色:即为代理对象所代表的目标对象,代理角色所代表的真实对象,是我们最终要引用的对象。
interface Subject//抽象角色
{
public void doSomething();
}
class RealSubject implements Subject//真实角色
{
public void doSomething()
{
System.out.println( "call doSomething()" );
}
}
class SubjectProxy implements Subject//代理角色
{
//代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
Subject subimpl = new RealSubject();
public void doSomething()
{
System.out.println("before"); //调用目标对象之前可以做相关操作
subimpl.doSomething();
System.out.println("after");//调用目标对象之后可以做相关操作
}
}
public class Test
{
public static void main(String[] args) throws Exception
{
Subject sub = new SubjectProxy();
sub.doSomething();
}
}
2:动态代理
通过创建代理类并实现InvocationHandler
直接上代码
public interface IShop {
void buy();
}
public class Bestar implements IShop {
@Override
public void buy() {
System.out.println("购买腐乳");
}
}
public class DynamicPurchasing implements InvocationHandler {
private Object object;
public Object bind(Object obj){
this.object = obj;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object,args);
if (method.getName().equals("buy")){
System.out.println("买买买");
}
return result;
}
}
//使用时
public void testDynamicPurchasing(){
IShop iShop = (IShop) new DynamicPurchasing().bind(new Bestar());
iShop.buy();
}