Java的设计模式之JDK静态代理的实现原理

沙海 2018年8月20日16:41:09Java 设计模式 JavaWeb评论3201字数 1931阅读6分26秒阅读模式

静态代理

1.1 现实生活中的代理

假如我们要去买电脑,我们通常需要去找电脑代理商购买,电脑代理商去电脑工厂提货,电脑代理商可以赚取中间的差价。 假如我们想买火车票,我们可以直接去12306网站买票。可是太难抢到票了,于是我们去找火车票的黄牛,让黄牛帮我们去12306买票,黄牛买到票再加价卖给我们,赚取中间的差价。文章源自JAVA秀-https://www.javaxiu.com/725.html

你买电脑      ->      电脑代理商    ->       电脑工厂
你买火车票   ->      黄牛              ->      12306
调用者                    代理对象                 真正干活的目标对象

我们发现代理对象真正干活的目标都具有相同的功能(卖电脑/卖票),代理可以在中间赚取差价(增强功能)。文章源自JAVA秀-https://www.javaxiu.com/725.html

1.2 代理模式的作用

代理对象可以在调用者目标对象之间起到中介的作用。代理对象可以对目标对象的功能进行增强文章源自JAVA秀-https://www.javaxiu.com/725.html

1.3 代理模式涉及到四个要素

  1. 调用者: 你。
  2. 代理对象: 联想电脑代理商/黄牛。
  3. 目标对象: 电脑工厂/12306。
  4. 抽象对象: 代理对象和目标对象都共有的接口,保证代理对象和真实对象都有相应的方法,如电脑代理商和电脑工厂都需要有卖电脑的功能。

Java的设计模式之JDK静态代理的实现原理文章源自JAVA秀-https://www.javaxiu.com/725.html

1.4 什么是静态代理

由程序员创建代理类,再对其编译。在程序运行前,代理类的.class文件就已经存在了。文章源自JAVA秀-https://www.javaxiu.com/725.html

1.4 实现静态代理

  • Providable接口
/*
    提供商品的接口
 */
public interface Providable {
    // 卖电脑
    public abstract void sellComputer(double price);
    // 维修电脑
    public abstract void repairComputer(double price);
}
  • ComputerFactory目标对象
/*
    电脑工厂,真正生产电脑的厂商
 */
public class ComputerFactory implements Providable {
    @Override
    public void sellComputer(double price) {
        System.out.println("电脑工厂卖出一台电脑,价格: " + price);
    }

    @Override
    public void repairComputer(double price) {
        System.out.println("电脑工厂修好一台电脑,价格: " + price);
    }
}
  • ComputerProxy代理对象
public class ComputerProxy implements Providable {
    private ComputerFactory computerFactory;  // 拥有目标对象的成员变量

    public ComputerProxy(ComputerFactory computerFactory) {
        this.computerFactory = computerFactory;
    }

    // 对方法进行增强
    @Override
    public void sellComputer(double price) {
        double realPrice = price* 0.75;
        System.out.println("代理商收到:" + price + "元,实际使用" + realPrice + "去电脑工厂买电脑");
        computerFactory.sellComputer(realPrice);
        System.out.println("代理商赚到:" + (price - realPrice) + "元钱");
    }

    // 不需要增强的方法直接调用
    @Override
    public void repairComputer(double price) {
        computerFactory.repairComputer(price);
    }
}
  • 调用者Demo05
public class Demo05 {
    public static void main(String[] args) {
        // 1. 创建真实对象
        ComputerFactory computerFactory = new ComputerFactory();
        // 2. 创建代理对象
        ComputerProxy proxy = new ComputerProxy(computerFactory);

        // 3.调用代理对象的方法
        proxy.sellComputer(8000);
        proxy.repairComputer(1200);
    }
}
  • 运行效果

Java的设计模式之JDK静态代理的实现原理文章源自JAVA秀-https://www.javaxiu.com/725.html

1.5 静态代理优缺点

1.5.1 静态代理模式的优点

  • 不需要修改目标对象就实现了目标对象功能的增加

1.5.2 静态代理模式的缺点

  • 一个真实对象必须对应一个代理对象,如果大量使用会导致类的急剧膨胀。
  • 如果抽象对象中方法很多,则代理对象也要编写大量的代码。
文章源自JAVA秀-https://www.javaxiu.com/725.html
继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定