再战设计模式(七)之代理模式

代理模式

代理模式是工作中很重要的一个角色,相信大家对aop已经不再陌生,这里我举个例子 假设很多人都找周杰伦唱歌.他需要

1.面谈

2.合同起草

3.签字,收预付款

4.安排机票

5.唱歌

6.收尾款

  那么如果有很多人都要去找周杰伦唱歌,那么周杰伦就忙不过来了.这个时候他找一个经济人来帮他把重复的工作做了.那么他就只需要唱歌就好了.这就是我们所谓的代理模式

应用场景

1.安全代理:屏蔽对真实对象的访问

2.延迟加载.你获取到的是一个代理对象.真正用的时候才会使用真正的角色

分类:

静态代理(静态定义代理类)

动态代理(动态生成代理类)

  1. jdk自带的动态代理
  2. javaassits 字节码操作库实现
  3. CGlib实现动态代理
  4. ASM(底层使用指令.,可维护性比较差)

实现demo

静态代理:

public class RealStar implements  Star {

    public void confer() {
        System.out.println("RealStar.confer");

    }

    public void signContract() {
        System.out.println("RealStar.signContract");

    }

    public void sing() {
        System.out.println("周杰伦唱歌...");

    }

    public void collect() {
        System.out.println("RealStar.collect");

    }
}

public  interface Star {

    void confer();
    void signContract();
    void sing();

    void collect();



}
public class StarAdapter implements Star{
    private Star star;

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

    public void confer() {
        System.out.println("StarAdapter.confer");
    }

    public void signContract() {
        System.out.println("StarAdapter.signContract");
    }

    public void sing() {
        star.sing();
    }

    public void collect() {
        System.out.println("StarAdapter.collect");
    }
}

public class Client {
    public static void main(String[] args) {

        Star realStar = new RealStar();
        StarAdapter adapter = new StarAdapter(realStar);

        adapter.confer();
        adapter.signContract();
        adapter.sing();
        adapter.collect();

    }
}
View Code

静态代理类用的不多.主要是使用动态代理

 

动态代理 

/**
 * @Created by xiaodao
 * 接口
 */
public  interface Star {

    void confer();
    void signContract();
    void sing();

    void collectMoney();



}
/**
 * @Created by xiaodao
 * 接口实现类...
 */
public class RealStar implements Star {
    public void confer() {
        System.out.println("RealStar.confer");
    }

    public void signContract() {
        System.out.println("RealStar.signContract");

    }

    public void sing() {
        System.out.println("本人唱歌");

    }

    public void collectMoney() {
        System.out.println("RealStar.collectMoney");

    }
}
/**
 * @Created by xiaodao
 *
 * 
 */
public class StarHandler implements InvocationHandler {

    private Star star;

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        method.invoke(star,args);
        if (method.getName().equals("sing")){
            System.out.println("本人唱歌要加钱");
        }
        return null;
    }
}
public class Client {

    public static void main(String[] args) {
        Star star = new RealStar();
        StarHandler handler = new StarHandler(star);

      Star proxyInstance  =(Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class},handler);

      proxyInstance.sing();
      proxyInstance.collectMoney();
    }
}

类图

类图中没有显示.main方法中的proxy类.大家理解下就好. 

JDK自带的动态代理
– java.lang.reflect.Proxy
• 作用:动态生成代理类和对象
– java.lang.reflect.InvocationHandler(处理器接口)
可以通过invoke方法实现对真实角色的代理访问。
• 每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象

转载于:https://www.cnblogs.com/bj-xiaodao/p/10841500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值