Java设计模式之静态代理

1 介绍

  • 功能:用代理类帮助当前类实现某个公共方法,好处是代理类可以在当前类执行这个公共方法的基础上增加自己的功能。例如当前类的add方法可以打印两个参数的商,代理类可以代理当前类执行add方法并在执行前检查被除数是否为0,同时还可以在执行后统计时间。
  • 形象描述:A是电脑厂家,A虽然可以卖电脑但是他没有渠道,卖的很慢。所以A可以请B(代理商)代理其卖电脑,卖完后再分钱。

2 代码

小知识

  1. 只有一个方法的接口被称为函数式接口,可以标记@FunctionalInterface注解
  • 公共接口:卖电脑
@FunctionalInterface // 加该注解只会编译时检查是不是只有一个接口,加不加无所谓
public interface Sell {
    public void sellComputer(); // 卖电脑
}
  • 厂家:实现公共接口
public class Factory implements Sell{
    @Override
    public void sellComputer() {
        System.out.println("出售电脑1000一台");
    }
}
  • 代理商
public class ProxySeller implements Sell{

    private Sell target; // 注意这里放了Sell接口属性

    public ProxySeller(Sell target) { // 有参构造函数
        this.target = target;
    }
    public ProxySeller(){}

    // 代理执行具体代码
    public void proxySell(){
        System.out.println("宣传电脑");
        this.sellComputer();
        System.out.println("和厂家分钱");
    }

    // 实现接口,
    @Override
    public void sellComputer() {
        if(this.target != null) {
            this.target.sellComputer();
        }
    }
}
  • 执行:静态代理的几种方式。
public static void main(String[] args) {
    // 1. 建工厂对象,让该对象被代理
    new ProxySeller(new Factory()).proxySell();

    // 2. 匿名类直接实现Sell接口
    new ProxySeller(new Sell() {
        @Override
        public void sellComputer() {
            System.out.println("卖电脑1");
        }
    }).proxySell();

    // 3. 函数式接口Lambda方式:当方法的参数是一个函数式接口(只有一个抽象方法),
    //    本例是2的简写
    new ProxySeller(() -> System.out.println("卖电脑2")).proxySell();

    // 4. 匿名类直接重新实现接口方法, 即不经过代理直接用,非静态代理,不用看
    new ProxySeller(){
        @Override
        public void sellComputer(){
            System.out.println("卖电脑3");
        }
    }.proxySell();
}