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

  • A+
所属分类:Java 设计模式 JavaWeb

静态代理

1.1 现实生活中的代理

假如我们要去买电脑,我们通常需要去找电脑代理商购买,电脑代理商去电脑工厂提货,电脑代理商可以赚取中间的差价。 假如我们想买火车票,我们可以直接去12306网站买票。可是太难抢到票了,于是我们去找火车票的黄牛,让黄牛帮我们去12306买票,黄牛买到票再加价卖给我们,赚取中间的差价。

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

我们发现代理对象真正干活的目标都具有相同的功能(卖电脑/卖票),代理可以在中间赚取差价(增强功能)。

1.2 代理模式的作用

代理对象可以在调用者目标对象之间起到中介的作用。代理对象可以对目标对象的功能进行增强

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

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

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

1.4 什么是静态代理

由程序员创建代理类,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

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静态代理的实现原理

1.5 静态代理优缺点

1.5.1 静态代理模式的优点

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

1.5.2 静态代理模式的缺点

  • 一个真实对象必须对应一个代理对象,如果大量使用会导致类的急剧膨胀。
  • 如果抽象对象中方法很多,则代理对象也要编写大量的代码。
  • 资源分享QQ群
  • weinxin
  • 官方微信公众号
  • weinxin
沙海
美女讲师教你学C语言
C语言项目源码分享
Linux服务器网站环境安装
Java图书管理系统

发表评论

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