设计模式-代理模式-java

上接:代理模式

介绍

Java代理分为:

  1. 静态代理
  2. 动态代理
    • JDK动态代理
    • cglib代理

例子图解

静态代理

结构

  1. 目标接口:通过接口或抽象类声明业务方法。
  2. 目标类:实现目标接口,实现具体业务
  3. 代理(Proxy)类:内部有 目标类对象,实现目标接口,实现具体业务,并可以访问、控制或扩展 目标类 的功能。

优点:

在 不改变目标类 的情况下,实现了扩展。

缺点:

代理类实现目标接口,一旦 目标接口增加方法,代理类 要进行相应的修改,增加维护成本。

例子

定义 演员 接口

public interface IActor {
    public boolean deal(int money,int days);
}

定义 演员类

public class Actor implements IActor{
    public boolean deal(int money, int days) {
        System.out.println(String.format("Actor==收到合约,酬劳:%s万,合约期:%s天",money,days));
        System.out.println("Actor==演戏");
        return true;
    }
}

定义 经纪人类(代理类)

public class Agent implements IActor{
    private IActor actor;

    public Agent (IActor actor){
        this.actor=actor;
    }
    public boolean deal(int money, int days) {
        //代理类可以在目标对象的方法之前,增加额外的代码
        if( money/days<1){
            System.out.println("Agent==每天酬劳低于1万,不合作!");
            return false;
        }
        System.out.println(String.format("Agent==经纪人扣30%%劳务费:%s,实付70%%给演员",money*3/10));
        //代理类可以修改传入目标对象的参数,返回值
        actor.deal(money*7/10,days);
        //代理类可以在目标对象的方法之后,增加额外的代码
        System.out.println("Agent==合作愉快,期待下次合作!");
        return true;
    }
}

说明:

  1. 在 目标类方法的前面,增加额外代码:
    1. 当日薪小于1万时,就拒拍
    2. 当日薪大于1万时,就接拍
  2. 修改传入参数
  3. 可以决定 是否调用 目标类方法
  4. 可以 修改返回值
  5. 可以在 目标类方法的后面,增加额外代码

在不改变 目标类 的情况下,增加额外的代码

定义 导演类(主启动类)

public class Director {
    public static void main(String[] args) {
        IActor actor=new Actor();
        IActor agent=new Agent(actor);

//        int money=350;
        int money=280;
        int days=300;
        System.out.println(String.format("Director==谈合作:%s万,%s天,可以吗?",money,days));
        boolean b=agent.deal(money,days);
        if(b) {
            System.out.println("Director==开拍");
        }else{
            System.out.println("Director==演员没谈成,不能开拍");
        }
    }
}

JDK动态代理

设计模式-代理模式-JDK动态代理(Proxy.newProxyInstance)

cglib动态代理

设计模式-代理模式-cglib动态代理


原文出处:/show_1IX2q7z1T0T.html