Android常用设计模式之代理模式

24 篇文章 0 订阅
  1. 代理模式:自己的事交给别人去做,分别返回处理结果即可,如异步线程;

通过代理,控制对对象的访问。可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。

 

  • 静态代理

 

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("====RealStar.confer()");

  }

 

  @Override

  public void signContract() {

    System.out.println("====RealStar.signContract()"); 

  }

 

  @Override

  public void bookTicket() {

    System.out.println("====RealStar.bookTicket()");

  }

 

  @Override

  public void sing() {

    System.out.println("====RealStar.sing()");

  }

 

  @Override

  public void collectMoney() {

    System.out.println("====RealStar.collectMoney()");

  }

 

}

 

public class ProxyStar implements Star{

  private Star star;

 

  public ProxyStar(Star star) {

    super();

    this.star = star;

  }

 

  @Override

  public void confer() {

    System.out.println("====ProxyStar.confer()");

  }

 

  @Override

  public void signContract() {

    System.out.println("====ProxyStar.signContract()");

  }

 

  @Override

  public void bookTicket() {

    System.out.println("====ProxyStar.bookTicket()");

  }

 

  @Override

  public void sing() {

    star.sing();

  }

 

  @Override

  public void collectMoney() {

    System.out.println("====ProxyStar.collectMoney()");

  }

 

}

 

 

public class Test {

 

  public static void main(String[] args) {

    Star real = new RealStar();

    Star proxyStar = new ProxyStar(real);

    proxyStar.bookTicket();

    proxyStar.collectMoney();

    proxyStar.confer();

    proxyStar.sing();

  }

 

}

 

  • 动态代理

JDK自带的动态代理

-java.lang.reflect.Proxy

作用:动态生成代理类和对象

-java.lang.reflect.InvocationHandler(处理器接口)

·可以通过invoke方法实现对真实角色的代理访问。

·每次通过Proxy生成代理类对象时都要指定对应的处理对象

 

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("====RealStar.confer()");

  }

 

  @Override

  public void signContract() {

    System.out.println("====RealStar.signContract()"); 

  }

 

  @Override

  public void bookTicket() {

    System.out.println("====RealStar.bookTicket()");

  }

 

  @Override

  public void sing() {

    System.out.println("====RealStar.sing()");

  }

 

  @Override

  public void collectMoney() {

    System.out.println("====RealStar.collectMoney()");

  }

 

}

 

public class StarHandler implements InvocationHandler{

  private Star realStar;

 

  public StarHandler(Star realStar) {

    super();

    this.realStar = realStar;

  }

 

  @Override

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

    method.invoke(realStar, args);

    return null;

  }

 

}

 

public class Test {

 

  public static void main(String[] args) {

    Star real = new RealStar();

    StarHandler handler = new StarHandler(real);

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

    proxy.bookTicket();

    proxy.collectMoney();

    proxy.signContract();

    proxy.sing();

  }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值