当前位置:编程学习 > JAVA >>

Java动态代理学习1——静态代理

一、代理模式


代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

 

按照代理的创建时期,代理类可以分为两种:


静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态代理:在程序运行时运用反射机制动态创建而成。

 

 

二、单个静态代理

 

[java] 
public inte易做图ce CountDao 

    // 查看账户方法  
    public void queryCount(); 

 
public class CountDaoImpl implements CountDao 

    public void queryCount() 
    { 
        System.out.println("查看账户方法..."); 
    } 
}  www.zzzyk.com
 
public class CountTrancProxy implements CountDao 

    private CountDao countDao; 
 
    public CountProxy(CountDao countDao) 
    { 
        this.countDao = countDao; 
    } 
 
    @Override 
    public void queryCount() 
    { 
        System.out.println("tranc start"); 
        countDao.queryCount(); 
        System.out.println("tranc end"); 
    } 

 
public class TestCount 

    public static void main(String[] args) 
    { 
        CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl()); 
        countProxy.updateCount(); 
    } 

public inte易做图ce CountDao
{
 // 查看账户方法
 public void queryCount();
}

public class CountDaoImpl implements CountDao
{
 public void queryCount()
 {
  System.out.println("查看账户方法...");
 }
}

public class CountTrancProxy implements CountDao
{
 private CountDao countDao;

 public CountProxy(CountDao countDao)
 {
  this.countDao = countDao;
 }

 @Override
 public void queryCount()
 {
  System.out.println("tranc start");
  countDao.queryCount();
  System.out.println("tranc end");
 }
}

public class TestCount
{
 public static void main(String[] args)
 {
  CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl());
  countProxy.updateCount();
 }
}
tranc start
查看账户方法...
tranc end

 

 

三、多个静态代理

 

在上面代码的基础上新增了

[java] 
public class CountLogProxy implements CountDao 

    private CountDao countDao; 
 
    public CountLogProxy(CountDao countDao) 
    { 
        this.countDao = countDao; 
    } 
 
    @Override 
    public void queryCount() 
    { 
        System.out.println("Log start"); 
        countDao.queryCount(); 
        System.out.println("Log end"); 
    } 

public class CountLogProxy implements CountDao
{
 private CountDao countDao;

 public CountLogProxy(CountDao countDao)
 {
  this.countDao = countDao;
 }

 @Override
 public void queryCount()
 {
  System.out.println("Log start");
  countDao.queryCount();
  System.out.println("Log end");
 }
}调用代码就变成了

[java] 
//  体现了聚合的思想,代理之间的组合  
public static void main(String[] args) 

    CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl()); 
    CountLogProxy logPro = new CountLogProxy(trancProxy); 
    logPro.queryCount(); 

 //  体现了聚合的思想,代理之间的组合
 public static void main(String[] args)
 {
  CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl());
  CountLogProxy logPro = new CountLogProxy(trancProxy);
  logPro.queryCount();
 }

Log start
事务处理之前
查看账户方法...
事务处理之后
Log end


 

 

四、总结

其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

 

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,