文章目录
代理模式
创建代理对象控制目标对象(被代理对象),代理对象可以增加格外的功能。
静态代理简单实现
项目结构
日志工具类 LogUtil.java
package com;
import java.util.Date;
//日志工具类
public class LogUtil {
public static void log() {
System.out.println("登陆成功,当前时间为:"+new Date().toLocaleString());
}
}
代理模式的接口 UserService .java
package com;
//代理模式的接口
public interface UserService {
public boolean login(String loginName, String pwd);
//public boolean regist(String loginName, String pwd);
}
代替代理类得那个类
package com;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//本质是反射
public class LogHanler implements InvocationHandler{
private Object delegate;
//创建目标的代理对象(被代理对象)
public Object bind(Object delegate) {
this.delegate = delegate;
//单数1:目标对象的类加载器,参数2:目标接口,参数3:代理类
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
}
//上面方法执行时,下面得方法也会自动执行
//参数2:登陆方法,参数3:登陆方法参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过反射调用方法,被代理得目标方法
Object result = method.invoke(delegate, args);
LogUtil.log();
return result;
}
}
被代理类 UserServiceImpl .java
package com;
//这是被代理类
public class UserServiceImpl implements UserService{
public boolean login(String loginName, String pwd) {
//登录的业务逻辑
boolean result = "zs".equals(loginName) && "123".equals(pwd);
System.out.println("登录的业务逻辑");
return result;
}
public boolean regist(String loginName, String pwd) {
return true;
}
}
测试类 Test.java
package com;
public class Test {
public static void main(String[] args) {
//调用的是代理类
UserService us = new UserServiceProxy();
boolean result = us.login("zs", "123");
System.out.println(result);
}
}
动态代理
可以自动生成,
项目结构
日志工具类 LogUtil.java
package com;
import java.util.Date;
//日志工具类
public class LogUtil {
public static void log() {
System.out.println("登陆成功,当前时间为:"+new Date().toLocaleString());
}
}
代理模式的接口 UserService .java
package com;
//代理模式的接口
public interface UserService {
public boolean login(String loginName, String pwd);
//public boolean regist(String loginName, String pwd);
}
代理类 UserServiceProxy .java
package com;
//代理对象,这是代理类,调用了原来的功能
public class UserServiceProxy implements UserService{
//放入被代理对象
private UserServiceImpl userServiceImpl;
@Override
public boolean login(String loginName, String pwd) {
userServiceImpl = new UserServiceImpl();
boolean result = userServiceImpl.login(loginName, pwd);
LogUtil.log();
return result;
}
public boolean regist(String loginName, String pwd) {
return true;
}
}
被代理类 UserServiceImpl .java
package com;
//这是被代理类
public class UserServiceImpl implements UserService{
public boolean login(String loginName, String pwd) {
//登录的业务逻辑
boolean result = "zs".equals(loginName) && "123".equals(pwd);
System.out.println("登录的业务逻辑");
return result;
}
public boolean regist(String loginName, String pwd) {
return true;
}
}
测试类 Test.java
package com;
public class Test {
public static void main(String[] args) {
//动态代理
LogHanler logHanler = new LogHanler();
//创建代理对象,参数是目标对象
UserService us = (UserService)logHanler.bind(new UserServiceImpl());
boolean result = us.login("zs", "123");
System.out.println(result);
// us.regist("zs", "123");
}
}