美文网首页
设计模式篇|代理模式

设计模式篇|代理模式

作者: 青年心路 | 来源:发表于2019-08-13 18:47 被阅读0次
1.代理模式简介

通过在访问者和提供者中间添加一个代理,这样可以避免访问者直接与提供者的访问。例如:生活中找歌手唱歌,首先需要找到歌手的经纪人,通过经纪人联系歌手。其中经纪人就是一个代理。

作用
  • 通过代理,实现对某个对象的访问
分类
  • 静态代理(静态定义代理类)
  • 动态代理(动态生成代理类)
    • jdk自带的动态代理
    • CGLIB
动态代理相比于静态代理具有的优势:
  • 抽象角色(接口)声明的所有方法都被转移到一个集中的方法中处理,这样我们可以更加灵活和统一的处理众多方法。
2.静态代理的实现

这里使用明星和经纪人的例子进行表示

  • 创建接口
public interface Star {

    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收尾款
    void collectMoney();
}
  • 明星本人(真实角色)
/**
 * 明星本人
 */
public class RealStar implements Star {

    @Override
    public void confer() {
        System.out.println("真实角色面谈");
    }

    @Override
    public void signContract() {
        System.out.println("真实角色签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("真实角色订票");
    }

    @Override
    public void sing() {
        System.out.println("真实角色唱歌");
    }

    @Override
    public void collectMoney() {
        System.out.println("真实角色收尾款");
    }
}
  • 经纪人(代理角色)
/**
 * 经纪人
 */
public class ProxyStar implements Star {

    private Star star;

    public ProxyStar(Star star) {
        this.star = star;
    }

    @Override
    public void confer() {
        System.out.println("代理明星去面谈");
    }

    @Override
    public void signContract() {
        System.out.println("代理明星去签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("代理明星去订票");
    }

    @Override
    public void sing() {
        //唱歌行为经纪人无法代理,所以需要调用歌手
        star.sing();
    }

    @Override
    public void collectMoney() {
        System.out.println("代理明星收尾款");
    }
}
  • 测试
public class Client {

    public static void main(String[] args) {
        Star real = new RealStar();
        //实现了对真实角色的代理
        Star proxy = new ProxyStar(real);

        proxy.confer();
        proxy.signContract();
        proxy.bookTicket();
        //这里代理角色找真实角色进行相应的行为,此时调用者不需要知道内部流程
        proxy.sing();
        proxy.collectMoney();
    }
}

运行效果图


image.png
3.动态代理的实现(JDK)
  • 创建接口(抽象角色)
public interface Star {

    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收尾款
    void collectMoney();
}
  • 明星(真实角色)
/**
 * 明星本人
 */
public class RealStar implements Star {

    @Override
    public void confer() {
        System.out.println("真实角色面谈");
    }

    @Override
    public void signContract() {
        System.out.println("真实角色签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("真实角色订票");
    }

    @Override
    public void sing() {
        System.out.println("真实角色唱歌");
    }

    @Override
    public void collectMoney() {
        System.out.println("真实角色收尾款");
    }
}
  • 经纪人(代理角色)
public class StarHandler implements InvocationHandler {

    Star realStar;

    public StarHandler(Star realStar) {
        this.realStar = realStar;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(realStar,args);
        return null;
    }
}
  • 测试
    @Test
    public void testProxy(){
        Star realStar = new RealStar();

        Star proxy = (Star) Proxy.newProxyInstance(realStar.getClass().getClassLoader(),
                realStar.getClass().getInterfaces(), new StarHandler(realStar));

        proxy.sing();
    }

运行效果图


image.png

相关文章

网友评论

      本文标题:设计模式篇|代理模式

      本文链接:https://www.haomeiwen.com/subject/qnybjctx.html