定义
Proxy是代理人的意思,指的是代替别人进行工作的人。当不一定需要本人亲自去做的工作的时候,就可以寻找代理人去完成。
但在代理模式中,往往是相反的,通常是代理人碰到工作,就交给被代理的对象去完成,代理人只完成一些准备工作或者收尾工作。
目的
1 通过引入代理对象的方式来间接访问目标对象 防止直接访问目标对象堆系统带来不必要的复杂性
2 通过代理对象对原有的业务加强
要素
委托对象 (快递店)
代理类 (跑腿业务员)
客户类 (点跑腿业务的人)
静态代理模式
UML类图
委托的抽象对象(快递店)
public interface Shop {
void makeFood(String size);
}
实现
public class ShopImpl implements Shop {
@Override
public void makeFood(String size) {
System.out.println("给你制作了一个" + size + "的食物");
}
}
跑腿业务员
public class Sender implements Shop {
private Shop shop;
public Sender(Shop shop) {
this.shop = shop;
}
@Override
public void makeFood(String size) {
doSomethingBefore();
shop.makeFood(size);
doSomethingAfter();
}
//业务加强 让用户知道送餐情况
private void doSomethingBefore() {
System.out.println("跑腿小哥正在取");
}
//业务加强 让用户知道送餐情况
private void doSomethingAfter() {
System.out.println("跑腿小哥取回来了");
}
}
用户类
public class Test {
public static void main(String[] args) {
Shop shop = new ShopImpl();
Sender sender = new Sender(shop);
//用户只用告诉跑腿小哥是一个大号的物品 跑腿小哥可以取回来
sender.makeFood("大号");
}
}
快递小哥正在取餐
给你制作了一个大号的食物
快递小哥送到了请签收
以上便是静态代理模式,但是Sender类的扩展性就很差,可维护性也很差. 如果不知道物品大小了 但现在不需要提供大小而是需要提供身份证了 那就无法维护了 这便是静态代理的弊端
动态代理模式
UML类图
场景:买票
代理对象
public interface Buyer {
void login(String username, String password);
void buyTickt();
}
---------------------------------------------
public class BuyerImpl implements Buyer {
private String name;
public BuyerImpl(String name) {
this.name = name;
}
@Override
public void login(String username, String password) {
System.out.println("用户名:"+username+"-----密码:"+password);
}
@Override
public void buyTickt() {
System.out.println(name + "正在购票");
}
}
代理类
public class BuyerProxy implements Buyer {
private Buyer buyer;
public BuyerProxy(Buyer buyer) {
this.buyer = buyer;
}
@Override
public void login(String username, String password) {
this.buyer.login(username, password);
}
@Override
public void buyTickt() {
doSomethingBefore();
this.buyer.buyTickt();
doSomethingAfter();
}
private void doSomethingBefore() {
System.out.println("开始出票");
}
private void doSomethingAfter() {
System.out.println("出票成功");
}
}
测试
public class Test {
public static void main(String[] args) {
Buyer buyer = new BuyerImpl("cy");
Buyer proxy = (Buyer) Proxy.newProxyInstance(BuyerImpl.class.getClassLoader(), BuyerImpl.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object o;
if ("buyTickt".equals(method.getName())) {
System.out.println("invoke start");
o = method.invoke(buyer, args);
System.out.println("invoke finish");
} else {
o = method.invoke(buyer, args);
}
return o;
}
});
proxy.login("cy", "123");
proxy.buyTickt();
}
}
用户名:cy-----密码:123
invoke start
cy正在购票
invoke finish
来源:CSDN
作者:呈易
链接:https://blog.csdn.net/qq_42252844/article/details/104544118