Java描述设计模式(16):代理模式

  

<强>本文源码:GitHub·点这里| | GitEE·点这里

  

一、生活场景

  

1场景描述

  
  

在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个快递的代收点,比如快递柜,快递驿站等,然后等有时间的时候再过去取,下面使用代码对这个场景进行简单的描述。

     

2场景图解

  

 Java描述设计模式(16):代理模式

  

3,源码实现

  
 <代码>公共类C01_InScene {
  公共静态void main (String [] args) {/*自己收快递的测试方式*/GetExpress GetExpress=new GetExpress ();
  getExpress.sureInfo ();
  getExpress.signName(“张三”);/*代收快递的测试方式*/ExpressAct getUser=new GetExpress ();
  ExpressAct getProxy=new ProxyExpress (getUser);
  getProxy.sureInfo ();
  getProxy.signName(“李四”);
  }
  }/* *
  *接收一个快递的动作接口:确认信息,签名
  */接口ExpressAct {
  空白sureInfo ();
  空白signName(字符串名称);
  }/* *
  *定义一个类接收快递:自己去拿快递
  */类GetExpress实现ExpressAct {
  @Override
  公共空间sureInfo () {
  System.out.println(“请确认你的个人信息!”);
  }
  @Override
  公共空间signName(字符串名称){
  System.out.println(“你的名字是:“+名字);
  }
  }/* *
  *定义一个类接收快递:找人代领快递
  */类ProxyExpress实现ExpressAct {
  私人ExpressAct ExpressAct=零;
  公共ProxyExpress (ExpressAct ExpressAct) {
  这一点。expressAct=expressAct;
  }
  @Override
  公共空间sureInfo () {
  this.expressAct.sureInfo ();
  }
  @Override
  公共空间signName(字符串名称){
  this.expressAct.signName(名称);
  }
  } 
  

二、代理模式

  

1,概念描述

  
  

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,就是一个对象代表另一个对象执行相应的动作程序。而代理对象可以在客户端和目标对象之间起到中介的作用。

     

2,模式图解

  

 Java描述设计模式(16):代理模式

  

3,核心角色

  
      <李>抽象对象角色李   
  
  

声明目标对象和代理对象的共同接口。

     
      <李>目标对象角色李   
  
  

定义了代理对象所代表的目标对象。

     
      <李>代理对象角色李   
  
  

代理对象内部含有目标对象的引用,可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象,AOP编程就是基于这个思想。

     

4,源码实现

  
 <代码>公共类C02_Proxy {
  公共静态void main (String [] args) {
  AbstractObject对象=new ProxyObject ();
  object.operation ();
  }
  }/* *
  *抽象对象角色
  */抽象类AbstractObject {
  公共抽象空操作();
  }/* *
  *目标对象角色
  */类TargetObject延伸AbstractObject {
  @Override
  公共空间操作(){
  system . out。println(“目标方法运行…”);
  }
  }/* *
  *代理对象角色
  */类ProxyObject延伸AbstractObject {
  TargetObject TargetObject=new TargetObject ();
  @Override
  公共空间操作(){
  system . out。println(“方法之前…”);
  targetObject.operation ();
  system . out。println(“后方法…”);
  }
  } 
  

三,JDK动态代理

  

基于JDK动态代理方式实现AOP切面编程。

  

1,代码实现

  
 <代码>公共类C03_JdkProxy {
  公共静态void main (String [] args) {
  BookService BookService=BookAopProxyFactory.createService ();
  System.out.println (bookService.getBook ());
  }
  }
  类BookAspect {
  公共空间在(){
  system . out。println(“方法之前…”);
  }
  公共空间后(){
  system . out。println(“后方法…”);
  }
  }
  接口BookService {
  字符串getBook ();
  }
  类BookServiceImpl实现BookService {
  @Override
  公共字符串getBook () {
  System.out.println(“目标方法【getBook】被执行”);
  返回“高性能MySQL”;
  }
  }
  类BookAopProxyFactory {
  公共静态BookService createService () {//目标类
  最后BookService BookService=new BookServiceImpl ();//切面类
  最后BookAspect BookAspect=new BookAspect ();/*
  *代理类:将目标类(切入点)和切面类(通知)结合
  */BookService proxyBookService=(BookService) Proxy.newProxyInstance (
  BookAopProxyFactory.class.getClassLoader (),
  .getInterfaces bookService.getClass () (),
  新的InvocationHandler () {
  公共对象调用对象代理、方法方法,
  {Object [] args)抛出Throwable//前执行
  bookAspect.before ();//执行目标类的方法
  对象obj=方法。调用(bookService, args);//后执行
  bookAspect.after ();
  返回obj;
  }
  });
  返回proxyBookService;
  }
  }

Java描述设计模式(16):代理模式