代理模式
程序员文章站
2022-07-10 18:22:09
一.小结定义:为其它对象提供一种代理以控制对这个对象的访问。特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。通用UML类图举例:小米手机的饥饿营销,每当小米手机新品发布后,一般需要抢购,米粉(真实角色)很难第一时间抢到,只能找黄牛(代理角色)加价购买。(以上仅供举例,...
一.小结
-
定义:为其它对象提供一种代理以控制对这个对象的访问。
-
特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
-
分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。
-
通用UML类图
-
举例:小米手机的饥饿营销,每当小米手机新品发布后,一般需要抢购,米粉(真实角色)很难第一时间抢到,只能找黄牛(代理角色)加价购买。(以上仅供举例,如有不适待删除)。
二.普通代理
// 真实对象与代理角色的契约
public interface IMiPhone {
void buy();
}
// 被代理的对象(真实对象)
public class MiFan implements IMiPhone {
@Override
public void buy() {
System.out.println("完全抢不到啊,吼吼吼");
}
}
// 代理角色
public class Scalper implements IMiPhone {
private IMiPhone miFan;
public Scalper() {
this(new MiFan());
}
private Scalper(IMiPhone miFan) {
this.miFan = miFan;
}
@Override
public void buy() {
miFan.buy();
addMoney();
System.out.println("给你买个红米K30s至尊纪念版");
}
// 代理商的私有方法
private void addMoney() {
System.out.println("加价300!");
}
// 代理商的私有方法
private void ad(){
System.out.println("我的QQ是6666,下次找我更优惠哈");
}
}
// 情景类
public class Client {
public static void main(String[] args) {
Scalper scalper = new Scalper();
scalper.buy();
}
}
三.强制代理
// 真实对象与代理角色的契约, 增加一个获取代理的方法
public interface IMiPhone {
void buy();
IMiPhone getProxy();
}
// 被代理的对象(真实对象),只能通过getProxy()指定自己的代理
public class MiFan implements IMiPhone {
private Scalper scalper;
@Override
public void buy() {
if (hasProxy()) {
System.out.println("加价300!");
System.out.println("给你买个红米K30s至尊纪念版");
} else {
System.out.println("自己完全抢不到啊,吼吼吼");
System.out.println("找黄牛吧,呜呜呜~~");
}
}
@Override
public IMiPhone getProxy() {
scalper = new Scalper(this);
return scalper;
}
private boolean hasProxy() {
return scalper != null;
}
}
// 代理角色
public class Scalper implements IMiPhone {
private IMiPhone miFan;
public Scalper(IMiPhone miFan) {
this.miFan = miFan;
}
@Override
public void buy() {
miFan.buy();
}
@Override
public IMiPhone getProxy() {
return this;
}
}
// 情景类
public class Client {
public static void main(String[] args) {
MiFan miFan = new MiFan();
miFan.getProxy().buy();
}
}
四.动态代理
// 已知的角色
public class Scalper {
public void buyEasy() {
System.out.println("我是黄牛,太舒服了啊");
}
}
// 要代理的接口
public interface IMiPhone {
void buy();
}
// 具体的实现类,当黄牛的小米粉丝
public class MiFan extends Scalper implements IMiPhone {
@Override
public void buy() {
System.out.println("完全抢不到啊,吼吼吼");
}
}
// 实现代理实例的接口
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
// 情景类
public class Client {
public static void main(String[] args) {
Scalper scalper = new MiFan();
// scalper.buyEasy();
// 生成真实角色
IMiPhone proxy = (IMiPhone) Proxy.newProxyInstance(scalper.getClass().getClassLoader(),
scalper.getClass().getInterfaces(),
new MyInvocationHandler(scalper));
proxy.buy();
}
}
本文地址:https://blog.csdn.net/wangadping/article/details/109588790
上一篇: 骨折后吃什么恢复得快
下一篇: Spingboot整合thymeleaf