设计模式——代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问。某些情况下,一个对象不适合或者不能直接访问目标对象时,代理对象在客户端与目标对象之间起中介作用。

角色组成
  1. 抽象角色:通过接口或抽象类声明真实角色实现的业务方法

  2. 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作

  3. 真实角色:实现抽象角色,定义真实角色需要实现的业务逻辑,供代理角色使用。

模式分类

静态代理:在运行前确定委托类与代理类之间的关系,即客户与代理之间的关系,另外静态代理代码耦合性比较强,需要在具体的业务方法中手动调用。
动态代理:动态代理实现,通过生成代理类的方式执行增强方法,减少代码耦合性。
静态代理方式,代理类在运行前自行创建

public static void main(String[] args) {
		//运行之前指定代理类
        AppleStoreProxy appleStoreProxy = new AppleStoreProxy();
        appleStoreProxy.sell("Macbook Pro 2019");
    }

而动态代理方式,代理类在运行时创建

public static void main(String[] args) {
    AppleStoreDynamicProxy dynamicProxy = new AppleStoreDynamicProxy(new AppleStore());
    SellComputer appleStoreProxy = (SellComputer) dynamicProxy.bind();
    appleStoreProxy.sell("MacbookPro 2019");
}

其中个别类说明

public class AppleStore implements SellComputer {

    @Override
    public void sell(String computerName) {
        System.out.println("尊敬的客户,你已购买AppleStore销售的" + computerName);
    }
}
public interface SellComputer {
    void sell(String computerName);
}
   public Object bind() {
        Class clazz = target.getClass();
        //运行时创建,只对接口进行动态代理
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }

实现分析

委托类<具体处理业务的类>与代理类<调用委托类方法>实现同一接口,代理类中调用委托类方法,另外加上自己的额外业务逻辑实现接口。

为什么要用代理模式?

中介隔离:代理类在客户类与委托类之间起中介隔离作用。

开闭原则,增强功能:对功能的新增,只需要修改代理类,无需修改委托类。例如,在完成业务需求之后,输出日志等操作。

优点

  1. 代理模式能将代理对象与真实对象被调用的目标对象分离。

  2. 一定程度上降低了系统的耦合度,扩展性好。

  3. 保护目标对象。

  4. 增强目标对象。

缺点

1.代理模式会造成系统设计中类的数目的增加。

2.在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢

3.增加了系统的复杂度。


具体代码实现以放至码云

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值