Java静态代理

静态代理过程比较简单直接,直接借用网上流行的UserDao例子

首先定义一个UserDao接口

package com.lihuia.proxy;

/**
* Copyright (C), 2018-2019
* FileName: UserDao
* Author: lihui
* Date: 2019/2/1
*/

public interface UserDao {

void save();
}

然后实现这个接口,其中实现类里直接将接口里的方法实现

package com.lihuia.proxy;

/**
* Copyright (C), 2018-2019
* FileName: UserDaoImpl
* Author: lihui
* Date: 2019/2/1
*/

public class UserDaoImpl implements UserDao {

@Override
public void save() {
System.out.println("----已经保存数据!----");
}
}

最后创建一个代理类同样也实现这个接口,但是代理类实现的方法里直接调用接口方法

package com.lihuia.proxy;

/**
* Copyright (C), 2018-2019
* FileName: UserDaoProxy
* Author: lihui
* Date: 2019/2/1
*/

public class UserDaoProxy implements UserDao {

private UserDao target;

public UserDaoProxy(UserDao target){
this.target=target;
}

@Override
public void save() {
target.save();
}
}

如此一来,假如想调用接口中的方法,可以直接调用代理类的方法即可,具体实现类隐藏起来

如果要进行测试,可以新建一个测试类

package com.lihuia.proxy;

import org.testng.annotations.Test;

/**
* Copyright (C), 2018-2019
* FileName: UserDaoProxyTest
* Author: lihui
* Date: 2019/2/1
*/

public class UserDaoProxyTest {

@Test
public void saveTest() {

UserDaoImpl target = new UserDaoImpl();
UserDaoProxy proxy = new UserDaoProxy(target);

proxy.save();
}
}

调用代理类的save方法,构造方法UserDaoProxy传了一个target参数,UserDaoImpl类型,赋给了UserDao类型的引用,因此代理类里的save方法里调用的save方法,调用的就是实现类里的save方法打印已经保存数据

静态代理,可以不修改UserDaoImpl目标类,通过更新UserDaoProxy代理类来扩展功能,save方法里新增即可;但是代理类必须和实现类同时实现接口,所以每一个实现类都会有一个代理类,只要接口里有变更方法,实现类和代理类必须同时都要更新

发表回复