Java设计模式解析之八——代理模式

1.前言

  • 设计模式共有23种(点击这里查看更多分类),根据目的准则分类,分为三类
    • 创建型设计模式,共5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
    • 结构型设计模式,共7中:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、响元模式。
    • 行为设计模式,共11种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
  • 这里介绍一下代理模式。

2.特点

  • 定义:为其他对象提供一种代理以控制对这个对象的访问。
  • 解释:主要有如下角色

    Subject:抽象主题类,声明真实主题与代理的共同接口方法。
    RealSubject:真实主题类,代理类所代表的真实主题。客户端通过代理类间接地调用真实主题类的方法。
    Proxy:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
    Client:客户端类。

2.1.代码说明

-------------------------------1.代理模式的简单实现-----------------------------------
抽象主题类,如下:

public interface IShop {

    void buy(String person);
}

真实主题类,如下:

public class MyselfShop implements IShop {
    @Override
    public void buy(String person) {
        System.out.println(person + "买面包");
    }
}

代理类,如下:

public class FriendShop implements IShop {

    private IShop mIShop;

    public FriendShop(IShop shop) {
        this.mIShop = shop;
    }

    @Override
    public void buy(String person) {
        mIShop.buy(person);
    }
}

最终调用,如下:


MyselfShop myselfShop = new MyselfShop();
FriendShop friendShop = new FriendShop(myselfShop);
friendShop.buy("朋友帮我");
//---------------------打印日志-------------------------
//System.out: 朋友帮我买面包

-------------------------------2.动态代理模式的简单实现-----------------------------------

  • 解释:静态代理是在代码运行前就已经存在了代理类的class编译文件;动态代理是在代码运行时通过反射来动态地生成代理类的对象,并确定到底来代理谁。

Java提供了动态的代理接口InvocationHandler,实现这个接口需要重写invoke()方法,如下:

public class DynamicPurchasing implements InvocationHandler {
    private Object mObject;
    public DynamicPurchasing(Object o) {
        this.mObject = o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(mObject, args);
//        if (method.getName().equals("buy")){
//            System.out.println("。。。");
//        }
        return invoke;
    }
}

最终调用,如下:

MyselfShop myselfShop = new MyselfShop();
DynamicPurchasing dynamicPurchasing =  new DynamicPurchasing(myselfShop);
ClassLoader classLoader = myselfShop.getClass().getClassLoader();
IShop shop = (IShop) Proxy.newProxyInstance(classLoader,new Class[]{IShop.class},dynamicPurchasing);
shop.buy("动态代理");

//---------------------打印日志-------------------------
//System.out: 动态代理买面包
2.2.优缺点
  • 优点:1⃣️真实主题类就是实现实际的业务逻辑,不用关系其他非本职的工作。2⃣️类的可扩展性比较广。
  • 缺点:1⃣️在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。2⃣️实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
2.3.使用场景
  • 按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
2.4.注意
  • 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
  • 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

3.总结

有疑问可以留言!

4.最后

开通了个公众号,扫码关注一下,可以及时收到我分享的内容哦!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值