代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口
静态代理:
就是我们打包后项目中已经存在的.class文件(这个文件的源码是有我们自己编写的/或者提供的java文件)
动态代理:
程序在运行时通过java的反射机制动态创建而成
代理类:
静态代理:
就是我们打包后项目中已经存在的.class文件(这个文件的源码是有我们自己编写的/或者提供的java文件)
动态代理:
程序在运行时通过java的反射机制动态创建而成
静态代理代码:
package com.mybatis.excample.staticDemo;
/**
* 接口类
*/
public interface UserService {
void addUser(String userId,String userName) throws Exception;
}
package com.mybatis.excample.staticDemo;
/**
* 用户实现类
*/
public class UserServiceImpl implements UserService {
@Override
public void addUser(String userId, String userName) {
System.out.println("执行用户添加 userId:"+userId+"用户名:"+userName);
}
}
代理类:
package com.mybatis.excample.staticDemo;
/**
* 代理类 用于增强 userServiceImpl
* Created by Administrator on 2018/1/23.
*/
public class ProxyUserService implements UserService{
private UserServiceImpl userService;
//覆盖掉 默认的构造
public ProxyUserService(UserServiceImpl userServiceImpl){
this.userService=userServiceImpl;
}
/**
* 重写UserService接口中的所有方法
* 并对方法中的操作进行增强
* @param userId
* @param userName
*/
@Override
public void addUser(String userId, String userName) throws Exception {
//实际执行之前执行操作
if(!userName.equals("222")) throw new Exception("名字必须是222");
//执行委托类中的实际执行的方法
userService.addUser(userId,userName);
//实际执行完成后 进行增强操作
System.out.println("222人物添加完毕");
}
}
package com.mybatis.excample.staticDemo;
/**
* 测试入口
*/
public class TestClient {
public static void main(String[] args) {
ProxyUserService userService = new ProxyUserService(new UserServiceImpl());
try {
userService.addUser("222", "222");
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制台打印结果为:
Connected to the target VM, address: '127.0.0.1:57083', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:57083', transport: 'socket'
执行用户添加 userId:222用户名:222
222人物添加完毕
Process finished with exit code 0
代理模式处于访问端与执行端的中间,这是就可以对委托类进行增强了,对访问的信息进行过滤处理然后执行委托类中的方法,完毕后可以对返回的数据再执行操作然后返回,在实际开发中如果实际的源码功能不支持现业务的引用可以采用代理模式对功能进行增强这点就非常符合java的开闭原则了
缺点:
静态代理制能对一个接口服务,在实际开发过程中会有n个接口,而接口中的方法也会不定时的增加这是很有可能的,大大增加的项目的维护复杂度,
对应这个这个例子可以想象出项目中各种各样的接口,而这些proxy代理类又再做着重复的操作只不过调用的接口不一样罢了,这也严重违反了java的复用性,到这时就该动态代理出场了