代理模式

代理模式

定义:代理模式就是指为其他对象提供一种代理,来控制对这个对象的访问,相当于在客户端和目标对象之
间起到一个中介的作用。比如 婚介公司,快递员,房产中介...
什么时候用到代理模式?代理模式的功能
1.保护目标对象

2.增强目标对象
静态代理

先看代码

//定义接口
public interface IPerson {

    void findHouse();
}

//被代理类
public class ZhangSan implements IPerson {
    @Override
    public void findHouse() {
        System.out.println("朝阳,空间大,价格便宜...");
    }
}

//代理类
public class StaticZhangSan implements IPerson {

    private IPerson iPerson;

    public StaticZhangSan(IPerson iPerson) {
        this.iPerson = iPerson;
    }

    @Override
    public void findHouse() {

        System.out.println("缴纳定金...");
        iPerson.findHouse();
        System.out.println("找到满意的房子...");

    }
}

//测试类
public class StaticTest {

    public static void main(String[] args) {

        //创建代理对象
        IPerson person = new StaticZhangSan(new ZhangSan());

        //执行代理对像的方法
        person.findHouse();
    }
}

有以上代码可以看出,静态代理优点和缺点
静态代理类 实现和目标代理类一样的接口,实现一样的方法。代理类的构造方法传入参数代理类
在代理类的方法中调用被代理类的方法。在调用前后植入代码。从而增强被代理类的功能。
动态代理
//接口
public interface IPerson {

    void findHouse();
}

//被代理类
public class ZhangSan implements IPerson {
    @Override
    public void findHouse() {
        System.out.println("朝阳,空间大,价格便宜...");
    }
}
//jdk动态代理类

public class JdkMedium implements InvocationHandler {


    private IPerson target;


    public IPerson getInstance(IPerson target) {

        this.target = target;
        IPerson person = (IPerson) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

        return person;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }

    private void after() {
        System.out.println("找到满意的房子...");
    }

    private void before() {
        System.out.println("缴纳定金...");
    }


}
//测试类
public class Test {

    public static void main(String[] args) {

        JdkMedium jdkMedium = new JdkMedium();

        IPerson instance = jdkMedium.getInstance(new ZhangSan());
        instance.findHouse();


    }
}
动态代理:便于扩展,被代理类增加方法,而无需修改代理类。
jdk 动态代理: 需要代理类必须要实现一个接口。
cglib动态代理:无需实现接口,而是代理类直接继承被代理类。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值