当前位置:首页 > java代理详细说明
Java之代理
一. 概念
代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道。如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法。如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱。所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户。而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品。 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象(目标对象,被代理对象)的引用。简单点说,就是通过一个工厂生成一个类的代理对象,当客户端使用的时候不直接使用目标对象,而是直接使用代理对象。
二. jdk的静态代理
Jdk的静态代理要求,目标对象和代理对象都要实现相同的接口。然后提供给客户端使用。这个代理对客户端是可见的,其结果图如下:
下面给出一个例子:
首先建立1个接口:UserService.java定义如下方法:
package com.xie.service;
public interface UserService {
public void addUser(String userId,String userName); public void delUser(String userId);
public void modfiyUser(String userId,String userName); public String findUser(String userId);
}
然后实现这个接口的目标对象:UserServiceImpl.java
package com.xie.serviceimpl;
import com.xie.service.UserService;
public class UserServiceImpl implements UserService {
}
为目标对象创建代理对象:UserServiceImplProxy.java代理对象持有目标对象的引用。 package com.xie.serviceproxy;
import com.xie.service.UserService;
public class UserServiceImplProxy implements UserService {
private UserService userService;
@Override
public String findUser(String userId) { }
System.out.println(\return \张山\; @Override
public void modfiyUser(String userId, String userName) { }
System.out.println(\@Override
public void delUser(String userId) { }
System.out.println(\delUser userId->>\+userId); @Override
public void addUser(String userId, String userName) { }
System.out.println(\addUser userId->>\+userId);
userId->>\+userId);
userId->>\+userId);
}
public UserServiceImplProxy(UserService userService){ }
@Override
public void addUser(String userId, String userName) { }
@Override
public void delUser(String userId) { }
@Override
public void modfiyUser(String userId, String userName) { }
@Override
public String findUser(String userId) { }
return null; try { }
System.out.println(\开始执行:addUser\); userService.addUser(userId, userName); System.out.println(\执行成功。\); System.out.println(\执行失败。\); this.userService = userService;
} catch (Exception e) {
最后调用代理对象完成功能:Client.java package com.xie.client;
import com.xie.service.UserService;
import com.xie.serviceimpl.UserServiceImpl; import com.xie.serviceproxy.UserServiceImplProxy;
public class Client {
public static void main(String[] args) {
UserService userService = new UserServiceImplProxy(new UserServiceImpl()); userService.addUser(\ } }
三. jdk动态代理
静态代理要为每个目标类创建一个代理类,当需要代理的对象太多,那么代理类也变得很多。同时代理类违背了可重复代理只写一次的原则。jdk给我们提供了动态代理。其原理图如下:
Jdk的动态要求目标对象必须实现接口,因为它创建代理对象的时候是根据接口创建的。如果不实现接口,jdk无法给目标对象创建代理对象。被代理对象可以可以实现多个接口,创建代理时指定创建某个接口的代理对象就可以调用该接口定义的方法了。 首先定义2个接口:Service接口和UserService接口(上面的接口) Service.java
package com.xie.service;
public interface Service {
public void sayHello(String name); public int addOperter(int num,int num2); }
然后定义实现这2个接口的目标对象:UserServiceImpl.java package com.xie.serviceimpl;
import com.xie.service.Service; import com.xie.service.UserService;
public class UserServiceImpl implements UserService ,Service{
@Override
public void addUser(String userId, String userName) {
System.out.println(\
共分享92篇相关文档