代理模式是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。俗称中介,例如房产中介这种。
举个例子:我想要向你租房子,但是我现在没有时间,我在做我自己的事情,同时我还要考虑很多问题,交通便不便利,上下班放不方便等等。所以我就委托一个中介来帮我看房子。我们两个不用见面,同时不影响我的事情,就可以把事情办好。
好处:就是尽量隐藏自己,并且能对目标方法进行加强。
想要代理一个对象就要和代理对象有相同的行为,那么就要实现同一个接口。
一 静态代理:自己写代理对象
举个例子:例如潘金莲和西门庆,潘和西一定不能明晃晃的见面,那么就一定要有一个人来替他们传递信息--->王婆,那么就可以来实现。王婆就是代理对象
(1)接口
(2)委托人 潘金莲
(3)中介 王婆 注意:构造器中的接口为参数 是使用了接口的多态
(4)接收人 西门庆
二 动态代理:jdk自动生成对象 利用反射技术:对类进行剖析
还是要有接口 委托人 和 接收人
package DaiLi;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//写一遍动态代理
public class XMP {
public static void main(String[] args) {
//1 你要找谁
IN pan=new PAN();
IN li=new LI();
//自动生成代理对象 必须要有接口
/*
* k1:被代理对象的类加载器
* k2:被代理对象的行为 类对象的方法
* k3:具体策略
* */
//动态代理用很多的次数
IN o=(IN)Proxy.newProxyInstance(pan.getClass().getClassLoader(),pan.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
int a=(int)method.invoke(pan,args);
//method.invoke(li,args);
method.invoke(li);
return a;
}
});
int eat =o.eat(22);
System.out.println(eat);
}
}
在main主函数中
(1)首先要先声明是谁--->委托人是谁
(2)使用JDK自己的代理对象,调用Proxy.newProxyInstance函数有三个参数
pan.getClass().getClassLoader(),被代理对象的类加载器 ,pan.getClass().getInterfaces(),被代理对象的行为 类对象的方法 利用反射 获取到接口中实现的方法 new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(pan);//利用反射 将对象传进去,如果有参数把args加进去,如下 //method.invoke(li,args); method.invoke(li); //调用同一个方法 有返回值的和无返回值的方法不能一起调用 return null;//可以有返回值 利用多态中的强转 } });
单例设计模式:保证在应用中只有一个对象就行了。
(1) 创建私有 静态对象
(2)构造方法为私有
(3)创建获取对象方法
分为懒汉式
// 懒汉式
public class User{
private static User user =new User();
private User(){};
public static User getUser(){
return user;
}
}
饿汉式
// 饿汉式
public class User{
private static User user =null;
private User(){};
public static User getUser(){
if(user ==null){
user =new User();
return user;
}
return user;
}
}