Java之代理设计模式

代理设计模式

  • 特点:两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作
  • 代码:
interface ISubject{
    void buyComputer();
}
class RealSubject implements ISubject{
   @Override
   public void buyComputer() {
       System.out.println("买一台外星人电脑");
   }
}
class ProxySubject implements ISubject{
   private ISubject subject;

   public ProxySubject(ISubject subject) {
       this.subject = subject;
   }

   public void produceComputer(){
       System.out.println("生产外星人电脑");
   }

   public void afterSale(){
       System.out.println("外星人电脑售后团队");
   }

   @Override
   public void buyComputer() {
       this.produceComputer();
       this.subject.buyComputer();
       this.afterSale();
   }
}
class Factory{
   public static ISubject getInstance(){
       return new ProxySubject(new RealSubject());
   }
}
public class Test {
   public static void main(String[] args) {
       ISubject subject = Factory.getInstance();
       subject.buyComputer();
   }
}
  • 本质:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成

动态代理设计模式

动态代理

特点:

  • 在程序运行时,通过反射机制动态生成,动态代理类通常代理接口下的所有类。
  • 动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。
  • 动态代理的调用处理程序必须先实现InvocationHandler接口,及使用Proxy类中的newProxyInstance方法动态的创建代理类,并覆写invoke方法,用来回调非主营业务。
  • Java动态代理只能代理接口,要代理类需要使用第三方的cligb等类库。

代码:

package com.github.Factory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface ISubject{
   void eat(String msg, int num);
}

class RealSubject implements ISubject{
   @Override
   public void eat(String msg, int num) {
       System.out.println("我要吃"+num+"个"+msg);
   }
}

class ProxySubject implements InvocationHandler{
   private Object target;

   public ProxySubject(Object target) {
       this.target = target;
   }

   public Object ProxyInstance(){
       return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
   }

   public void preHandle(){
       System.out.println("-------------before---------");
   }

   public void aftHandle(){
       System.out.println("-------------After-----------");
   }
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) {
       preHandle();
       Object ret = null;
       try {
           ret = method.invoke(this.target,args);
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       } catch (InvocationTargetException e) {
           e.printStackTrace();
       }
       aftHandle();
       return ret;
   }
}
public class Client {
   public static void main(String[] args) {
       ProxySubject proxySubject = new ProxySubject(new RealSubject());
       ISubject iSubject = (ISubject)proxySubject.ProxyInstance();
       iSubject.eat("面包",10);
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值