什么是代理?
简单的来说就把通过第三方来完成一件事。
代理分为:
1.静态代理 2.动态代理
1.静态代理
* 1.定义抽象行为的类【抽象类、接口】
* 2.定义具体的实现类实现抽象方法
* 3.定义代理类实现相同接口
* 4.代理类必须具有实现类对应的引用
*
* 缺点:
* 只能代理一类对象
* 扩张和维护难
直接上代码
* 1.定义抽象行为的类【抽象类、接口】
package com.proxy.staticsproxy;
/**
* 静态代理:
* 1.定义抽象行为的类【抽象类、接口】
* 2.定义具体的实现类实现抽象方法
* 3.定义代理类实现相同接口
* 4.代理类必须具有实现类对应的引用
*
* 缺点:
* 只能代理一类对象
* 扩张和维护难
* @author zy
*
*/
public interface IFunction {
void click();
String getName();
}
* 2.定义具体的实现类实现抽象方法
package com.proxy.staticsproxy;
public class Button implements IFunction {
private String name;
public Button(String name) {
this.name=name;
}
@Override
public void click() {
System.out.println(this.name+"被点击了");
}
@Override
public String getName() {
return name;
}
}
* 3.定义代理类实现相同接口* 4.代理类必须具有实现类对应的引用
package com.proxy.staticsproxy;
public class StaticsProxy implements IFunction {
private IFunction iFunction;
private String userName;
public StaticsProxy(IFunction iFunction,String userName) {
this.iFunction=iFunction;
this.userName=userName;
}
/*
* 对click进行包装,有点像装饰者
*/
@Override
public void click() {
if(this.userName.equalsIgnoreCase("管理员")){
iFunction.click();
}else {
System.out.println("没有权限点击");
}
}
//不需要的则不用管,这也是一个缺点,哪怕不用也要重写
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
测试类
package com.proxy.staticsproxy;
public class Test {
public static void main(String[] args) {
System.out.println("===========不用代理====================");
IFunction iFunction=new Button("提交");
iFunction.click();
System.out.println("===========用代理====================");
StaticsProxy staticsProxy=new StaticsProxy(iFunction, "管理员1");
staticsProxy.click();
}
}
2.动态代理
* 动态代理:
* 可以实现不同接口的代理
*
* 缺点:
* 代理的类必须实现了接口
*
* spring框架的动态代理已经解决了该问题
1.定义抽象部分的接口
package com.proxy.dynamicproxy;
/**
* 动态代理:
* 可以实现不同接口的代理
*
* 缺点:
* 代理的类必须实现了接口
*
* spring框架的动态代理已经解决了该问题
* @author zy
*
*/
public interface IFunction {
void click();
String name();
}
2.定义实现类
package com.proxy.dynamicproxy;
/**
* 文本框实现类
* @author zy
*
*/
public class Text implements IFunction {
private String name;
public Text(String name) {
this.name=name;
}
@Override
public void click() {
System.out.println(this.name+"被点击了");
}
@Override
public String name() {
return name;
}
}
3.定义动态代理类
package com.proxy.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy {
//定义object的对象,所以类的父类都是object
private Object obj;
private String userName;
public DynamicProxy() {
}
//初始化
public DynamicProxy(Object obj,String userName) {
this.obj=obj;
this.userName=userName;
}
//创建动态代理的对象;使用jdk自带的proxy来创建
public Object createProxy(){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),new HanderProxy());
}
//定义执行处理内部类
private class HanderProxy implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke=null;
//判断该引用是否是car类型
if(!(obj instanceof Car)){
validateLogin();
validateRole();
//这是是获取该方法执行后的返回值
invoke=method.invoke(obj,args);
requestDB();
responseWeb();
}else {
invoke = method.invoke(obj,args);
System.out.println(invoke);
}
return invoke;
}
}
private void validateLogin(){
System.out.println("登陆验证通过");
}
private void validateRole(){
System.out.println(this.userName+"身份验证通过");
}
private void requestDB(){
System.out.println("请求数据库");
}
private void responseWeb(){
System.out.println("响应到页面");
}
}
4.测试类
package com.proxy.dynamicproxy;
public class Test {
public static void main(String[] args) {
IFunction iFunction=new Text("文本框");
DynamicProxy dynamicProxy=new DynamicProxy(iFunction, "管理员");
IFunction proxy =(IFunction)dynamicProxy.createProxy();
proxy.click();
System.out.println("=============================");
//另一个接口
Car car=new Bike();
car.setName("山地自行车");
dynamicProxy=new DynamicProxy(car, "管理员");
Car car2 =(Car)dynamicProxy.createProxy();
car2.numberOfWheel();
car2.getName();
}
}
还有一个接口我并没有发布出来,第一次学习代理的可以自己试着写一写,毕竟自己写出来的才是自己的
运行结果:
登陆验证通过
管理员身份验证通过
文本框被点击了
请求数据库
响应到页面
=============================
自行车有两个轮子
null
山地自行车