理解23种设计模式-创建模式-代理模式

介绍一下代理模式
代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。

代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

在现实生活中,外卖员就是很好的例子,自己取外卖需要很久,外卖负责帮你取外卖,把外卖员当成代理,就会变得方便快捷

优点
1.代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
2.代理对象可以扩展目标对象的功能;
3.代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

缺点
1.代理模式会造成系统设计中类的数量增加
2.在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;

单例模式的实现
有静态代理模式,和动态代理模式
结构
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

代理模式的应用场景
张老板准备买房子了,买房子去哪呢,当然是中介了,把它当作代理很合适
抽象主题:客户! 抽象的,只会消费
真实主题:张老板!要买房子
代理类: 中介 帮你找房子

public class BuyHouse1 {
    public static void main(String[] args) {
        Subject zhang = new ZhangBoos();
        Proxy proxy = new Proxy(zhang);
        proxy.buy();

    }
}
//抽象主题  客户
interface Subject{
    //买房子
    void buy();

}
//真实主题  张老板
class ZhangBoos implements Subject{
    @Override
    public void buy() {
        System.out.println("我要买房子");
    }

}
class Proxy implements Subject{
    private Subject target;

    public Proxy(Subject target) {
        this.target = target;
    }

    @Override
    public void buy() {
        target.buy();
        System.out.println("好的先生我这就给你找");
    }

}

输出结果
我要买房子
好的先生我这就给你找

小结:
真实对象和代理对象都要实现同一个接口
代理对象要代理真实角色

这就是静态代理,静态代理中的代理是自己写出来的,而动态代理是通过反射 生成的代理,把中介想象成百宝箱只要有钱什么都给你找,这样的话张老板每有一个需求,代理需要多写一个对应的方法,很麻烦,动态代理轻松解决,看一下代码,同样的例子

public class BuyHouse2 {
    public static void main(String[] args) {
        Client client=new MrZhang();
        //获的处理器
        InvocationHandler myInvocationHandler = new MyHandler(client);
        //生成代理实例
        Client o = (Client)Proxy.newProxyInstance(client.getClass().getClassLoader(), client.getClass().getInterfaces(), myInvocationHandler);
        o.buy(100);
        o.findLover();
    }
}
interface Client{
    public void buy(Integer money);
    public void findLover();
}
class MrZhang implements Client{
    @Override
    public void buy(Integer money) {
        System.out.println("买"+money+"w左右的门市房");
    }

    @Override
    public void findLover() {
        System.out.println("我要找老婆");
    }
}
//调用的处理器
class MyHandler implements InvocationHandler{
    Client client;

    public MyHandler(Client client) {
        this.client = client;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(client,args);
        System.out.println("好的,我这就帮你找");
        return null;
    }
}

输出结果
买100w左右的门市房
好的,我这就帮你找
我要找老婆
好的,我这就帮你找

小结
设计代理以前真实主题必须事先存在,不太灵活。采用动态代理模式可以解决

通过反射获得代理,叫动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值