大家好我是苏麟 , 今天聊聊代理模式 .
此系列全是帮忙宣传 , 原创放在下面了 .
代理模式 Proxy Pattern 是?种结构型设计模式,?于控制对其他对象的访问。 在代理模式中,允许?个对象(代理)充当另?个对象(真实对象)的接?,以控制对这个对象的访问。通常?于 在访问某个对象时引??些间接层(中介的作?),这样可以在访问对象时添加额外的控制逻辑,?如限制访问权 限,延迟加载。 ?如说有?个?件加载的场景,为了避免直接访问“?件”对象,我们可以新增?个代理对象,代理对象中有?个对 “?件对象”的引?,在代理对象的 load ?法中,可以在访问真实的?件对象之前进??些操作,?如权限检查, 然后调?真实?件对象的 load ?法,最后在访问真实对象后进?其他操作,?如记录访问?志。
基本实现 : 静态代理
// 1. 定义抽象主题
interface Subject {
void request();
}
// 2. 定义真实主题
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject handles the request.");
}
}
// 3. 定义代理
class Proxy implements Subject {
// 包含?个引?
private RealSubject realSubject;
@Override
public void request() {
// 在访问真实主题之前可以添加额外的逻辑
if (realSubject == null) {
realSubject = new RealSubject();
}
// 调?真实主题的?法
realSubject.request();
// 在访问真实主题之后可以添加额外的逻辑
}
}
// 4. 客户端使?代理
public class Main {
public static void main(String[] args) {
// 使?代理
Subject proxy = new Proxy();
proxy.request();
}
}
基本实现 : 动态代理
给个视频 :?【黑马磊哥】Java动态代理深入剖析,真正搞懂Java核心设计模式:代理设计模式_哔哩哔哩_bilibili
?
/**
* 接口
*/
public interface Star {
String sing(String name);
void dance();
}
/**
* 对象类
* <p>
* 动态代理需要实现接口
*/
public class BigStar implements Star {
private String name;
public void setName(String name) {
this.name = name;
}
public String sing(String name) {
System.out.println(this.name + "正在唱 : " + name);
return "谢谢大家 !";
}
public void dance() {
System.out.println(this.name + "正在跳舞____ ");
}
}
/**
* 代理类
*/
public class ProxyUtils {
/**
* 产生代理
*
* @param bigStar 产生谁的代理
* @return 产生的代理一定是实现Star的对象
*/
public static Star proxyCreate(BigStar bigStar) {
/**
* ClassLoader loader, //用于指定一个类加载器 (用这个加载器加载生成的代
理类)
* Class<?>[] interfaces, //生成的代理长什么样子,也就是那些实现方法
* InvocationHandler h //生成的代理要干什么事情
*/
//产生一个BigStar代理对象
Star star = (Star)
Proxy.newProxyInstance(ProxyUtils.class.getClassLoader(), new Class[]
{Star.class}, new InvocationHandler() {
@Override //回调方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("sing")) {
System.out.println("准备话筒,收钱!");
} else if (method.getName().equals("dance")) {
System.out.println("准备场地,收钱!");
}
return method.invoke(bigStar, args);
}
});
return star;
}
}
public class Test {
public static void main(String[] args) {
BigStar star = new BigStar();
star.setName("张杰");
Star s = ProxyUtils.proxyCreate(star);
System.out.println(s.sing("逆战"));
}
}
______________________________________________________
准备话筒,收钱!
张杰正在唱 : 逆战
谢谢大家 !
使用场景
代理模式可以控制客户端对真实对象的访问,从?限制某些客户端的访问权限,此外代理模式还常?在访问真实对 象之前或之后执??些额外的操作(?如记录?志),对功能进?扩展。
但是代理模式涉及到多个对象之间的交互,引?代理模式会增加系统的复杂性,在需要频繁访问真实对象时,还可 能会有?些性能问题。
代理模式在许多?具和库中也有应用:
原创地址?:?GitHub - youngyangyang04/kama-DesignPattern: 卡码网-23种设计模式精讲,每种设计模式都配套代码练习题,支持 Java,CPP,Python,Go
?
了解更多 :?【黑马磊哥】Java动态代理深入剖析,真正搞懂Java核心设计模式:代理设计模式_哔哩哔哩_bilibili
?
这期就到这里,下期见!