设计模式五之代理模式

静态代理

/*
静态代理必须要有接口
被代理的类和代理类都去实现接口
代理类持有被代理类的引用
*/
public interface ISell {
    void sell();
}
public class Sell implements ISell{
    @Override
    public void sell() {
        System.out.println("arc sell");
    }
}
public class SellProxy implements ISell{
    private ISell src;

    public SellProxy(ISell src) {
        this.src = src;
    }

    @Override
    public void sell() {
        System.out.println("proxy start");
        src.sell();
        System.out.println("proxy end");
    }
}
public class Client {
    public static void main(String[] args) {
        ISell src = new Sell();
        SellProxy proxy = new SellProxy(src);
        proxy.sell();//虽然调用的是代理类 但是真正工作的还是被代理的目标对象
    }
}

JDK代理

/*
JDK代理的代理对象不需要实现任何接口
直接借助反射 动态地给被代理的类创建对象
*/
public interface ISell {
    void sell();
}
/**
被代理的类
*/
public class Sell implements ISell{
    @Override
    public void sell() {
        System.out.println("src sell");
    }
}
/**
代理的类 利用反射产生代理对象
*/
public class SellProxy{
    private ISell src;

    public SellProxy(ISell src) {
        this.src = src;
    }
    public Object getProxy(){
        return Proxy.newProxyInstance(src.getClass().getClassLoader(), src.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("proxy start");
                Object returnVal = method.invoke(src, args);
                System.out.println("proxy end");
                return returnVal;
            }
        });
    }
}
public class Client {
    public static void main(String[] args) {
        ISell src = new Sell();
        SellProxy proxy = new SellProxy(src);
        ISell instance = (ISell) proxy.getProxy();//被代理的类需要强转 然后执行被代理的类的方法。
        instance.sell();
    }
}

CGLIB代理

需要导入
asm
asm-commons
asm-tree
cglib
这四个jar

/**
CGLIB代理不需要任何接口
*/
public class Sell{
    public void sell() {
        System.out.println("src sell");
    }
}
/**
代理类
*/
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class SellProxy implements MethodInterceptor{
    private Object src;

    public SellProxy(Object src) {
        this.src = src;
    }

    // 产生代理对象
    public Object getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(src.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
	/*
	监听被代理的对象
	*/
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("代理对象的逻辑。。。");
        Object returnVal = method.invoke(src, objects);//被代理对象的逻辑
        System.out.println("代理对象的逻辑。。。");
        return returnVal;
    }
}
public class Client {
    public static void main(String[] args) {
        SellProxy proxy = new SellProxy(new Sell());
        Sell src = (Sell)proxy.getProxy();
        src.sell();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值