静态代理模式的详解和用法

   静态代理
  
     (1)什么是静态代理
      在程序中,一般在程序运行前,我们称为是静态的,只要是在运行过程中,我们都称为动态的。
      静态代理是由程序员手工编写的,代理关系在程序运行之前就已经确立的。
     
     
     (2)使用静态代理的要求
      (1)代理类要和目标类具有相同的业务方法。
       也就是说代理类是代表目标类和客户类进行联系的,目标类具备的一切
       功能,代理类也应该具备。达到这个要求的方式有两种,一时让目标类和代理类实现相同的业务接口来进行约束,
       二是让代理类和目标类继承同一个父类(但是这种方法的约束能力没有第一种的效果好)
       
       目标类中的对象称为目标对象, 代理类中的对象,称为代理对象。
       目标类中的方法称为是目标方法,代理类中的方法称为是代理方法
       
      (2)代理类中应该含有目标对象的引用,这样方便代理方法调用目标对象的目标方法
      
      (3)静态代理类中的目标对象,应该是被创建的,而不是通过参数从外部传入的,这样客户类只和代理类发生
        联系,压根就不知到目标类是谁,起到的保护和隐藏目标类的功能。
        
      (4)增强的过程,并没有发生在目标类,而是在代理类执行目标方法之前或者之后进行的增强。
      
      (5)一般会有一些不是主业务的逻辑代码出现在目标类中,我们为了保证目标类中是纯净的业务逻辑,同时为了
              提高代码的复用率,我们可以把这些方法单独抽取出来,并且用一个类来保存这些方法(最好设计成静态的)
              然后,在代理类中,目标方法的前后都可以添加这些交叉业务逻辑,这个过程称为植入,把交叉业务逻辑植入到
              主业务逻辑当中。
     (3)实现
           业务接口:
        package com.abc.service;
              //业务接口
             public interface ISomeService {
                String doSome(int a,String b);
                 void doOther();
        }
    
         业务接口的实现类(目标类):
        
package com.abc.service;
//目标类
public class SomeServiceImpl implements ISomeService {
 
 //目标方法
 public String doSome(int a, String b) {
  System.out.println("执行业务方法doSome!");
  return a+b;
 }
 
 //目标方法
 @Override
 public void doOther() {
  System.out.println("执行业务方法doOther!");
  
 }
}



//代理类
package com.abc.proxy;
import com.abc.service.ISomeService;
import com.abc.service.SomeServiceImpl;
import com.abc.utils.SystemUtil;
//代理类
public class ServiceProxy implements ISomeService {
 
 private ISomeService target = new SomeServiceImpl();
 //代理方法
 @Override
 public String doSome(int a, String b) {
  //系统级服务
  SystemUtil.doTx();
  String result = target.doSome(a, b);
  SystemUtil.doLog();
  return result;
 }
 
 
 //代理方法
 @Override
 public void doOther() {
  SystemUtil.doTx();
  target.doOther();
  SystemUtil.doLog();
 }
}


//交叉业务逻辑
package com.abc.utils;
//系统级服务(交叉业务逻辑)
public class SystemUtil {
 public static void doLog() {
  System.out.println("记录日志");
 }
 
 //
 public static void doTx() {
  System.out.println("开启事务");
 }
}

  

猜你喜欢

转载自blog.csdn.net/dawiebazhanlang/article/details/80938923