代理模式
/*
* 苹果笔记本的接口,其中有一个方法实现了买笔记本的动作
*/
public interface MacBook {
public void buy(); //购买笔记本的行为
}
/*
* 美国的笔记本,实现了MacBook接口,表示在美国买笔记本
*/
public class USAMac implements MacBook {
@Override
public void buy() {
System.out.println("在美国买笔记本");
}
}
/*
* 中国的笔记本,实现了MacBook 表示在中国买笔记本
* 但是中国想要买到苹果笔记本,那么还是需要先从美国进货,因此中国只是一个中间的代理作用而已
* 当然代理的最大作用就是在代理之前、之后、之中执行相关的操作,这就是面向切面编程的原理
*/
public class ChinaMac implements MacBook {
private MacBook mcBook=new USAMac(); //创建USAMac的对象
/**
* 在购买之前执行的操作
*/
public void preBuy(){
System.out.println("购买之前执行的操作");
}
/**
* 在购买之后执行的操作
*/
public void afterBuy(){
System.out.println("购买之后执行的操作");
}
@Override
public void buy() {
this.preBuy(); //之前执行的操作
mcBook.buy(); //在美国买笔记本
System.out.println("在中国买笔记本");
this.afterBuy(); //之后执行的操作
}
}
public class Client {
public static void main(String[] args) {
MacBook macBook=new ChinaMac(); //创建ChinaMac对象,在中国买笔记本
macBook.buy(); //直接在中国买笔记本
}
}
/*
* 用户的抽象类
*/
public interface User {
public void DoAction(); //执行动作
}
public class RealUser implements User {
public String name;
public String password;
public RealUser(String name, String password) {
this.name = name;
this.password = password;
}
public RealUser() {}
/*
* 执行一些操作
*/
@Override
public void DoAction() {
System.out.println("开始执行操作......");
}
}
public class ProxUser implements User {
private RealUser user; // 真实用户的对象
/**
* 创建对象
* @param name 姓名
* @param password 密码
*/
public ProxUser(String name, String password) {
user = new RealUser(name, password);
}
@Override
public void DoAction() {
//验证用户名和密码
if (Validate()) {
user.DoAction(); //调用真实用户的DoAction方法执行相关操作
logger(); //调用日志记录信息
} else {
System.out.println("请重新登录.......");
}
}
/*
* 验证用户的用户名和密码
*/
public Boolean Validate() {
if ("陈加兵".equals(user.name) && "123456".equals(user.password)) {
return true;
}
return false;
}
/**
* 添加日志记录信息
*/
public void logger() {
System.out.println(user.name + "登录成功......");
}
}
public class Client {
public static void main(String[] args) {
ProxUser proxUser=new ProxUser("陈加兵", "123456"); //创建代理对象
proxUser.DoAction(); //执行操作,实际执行了验证信息,doaction(),日志记录这个三个动作
}
}
public Object invoke(Object proxy,Method method,Object[] args)
Object proxy
:指被代理的对象。Method method
:要调用的方法Object[] args
:方法调用时所需要的参数public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
ClassLoader loader
:类加载器Class<?>[] interfaces
:得到全部的接口InvocationHandler h
:得到InvocationHandler接口的子类实例/*
* 肯德基的接口,其中一个eat方法
*/
public interface IKFC {
public void eat();
}
/*
* IKFC的实现类
*/
public class KFC implements IKFC {
@Override
public void eat() {
System.out.println("我在肯德基吃了饭......");
}
}
/*
* 苹果笔记本的接口
*/
public interface MacBook {
public void buy();
}
/*
* 美国笔记本的类,实现了MacBook接口
*/
public class USAMacBook implements MacBook {
@Override
public void buy() {
System.out.println("在美国买了一个苹果电脑......");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 这个是代理类,实现了InvocationHandler接口
*
*/
public class ProxyHandler implements InvocationHandler {
private Object Realobject; //被代理的对象
//构造方法,用来初始化被代理的对象
public ProxyHandler(Object obj){
this.Realobject=obj; //初始化真实类的对象
}
/**
* @param proxy 表示被代理的对象的,就是真实类的对象
* @param method 表示要调用真实类的方法
* @param args 表示方法调用的时候所需要的参数
* @return 方法调用之后的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
prefunction(); //执行之前调用的方法
Object res=method.invoke(Realobject, args); //Method类中的执行方法的函数,在反射中常用
afterFunction(); //执行之后调用的方法
return res;
}
/**
* 执行方法之前调用的方法
*/
public void prefunction(){
System.out.println("执行方法之前......");
}
/**
* 执行方法之后调用的方法
*/
public void afterFunction(){
System.out.println("执行方法之后......");
}
}
import java.lang.reflect.Proxy;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.org.apache.bcel.internal.util.Class2HTML;
public class Client {
public static void main(String[] args) {
Class[] cls1={IKFC.class}; //第一个代理的所有接口数组,直接用接口的反射即可
Class[] cls2=USAMacBook.class.getInterfaces(); //直接具体的实现类的反射调用getInterfaces即可返回所有的接口数组
// 返回KFC的代理对象
IKFC kfc = (IKFC) Proxy.newProxyInstance(Client.class.getClassLoader(),
cls1, new ProxyHandler(new KFC()));
kfc.eat(); //执行方法
MacBook macBook = (MacBook) Proxy.newProxyInstance(Client.class.getClassLoader(),
cls2, new ProxyHandler(
new USAMacBook()));
macBook.buy(); //执行方法
}
}