1.前言
- 设计模式共有23种(点击这里查看更多分类),根据目的准则分类,分为三类
- 创建型设计模式,共5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型设计模式,共7中:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、响元模式。
- 行为设计模式,共11种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
- 这里介绍一下代理模式。
2.特点
- 定义:为其他对象提供一种代理以控制对这个对象的访问。
- 解释:主要有如下角色
Subject:抽象主题类,声明真实主题与代理的共同接口方法。
RealSubject:真实主题类,代理类所代表的真实主题。客户端通过代理类间接地调用真实主题类的方法。
Proxy:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
Client:客户端类。
2.1.代码说明
-------------------------------1.代理模式的简单实现-----------------------------------
抽象主题类,如下:
public interface IShop {
void buy(String person);
}
真实主题类,如下:
public class MyselfShop implements IShop {
@Override
public void buy(String person) {
System.out.println(person + "买面包");
}
}
代理类,如下:
public class FriendShop implements IShop {
private IShop mIShop;
public FriendShop(IShop shop) {
this.mIShop = shop;
}
@Override
public void buy(String person) {
mIShop.buy(person);
}
}
最终调用,如下:
MyselfShop myselfShop = new MyselfShop();
FriendShop friendShop = new FriendShop(myselfShop);
friendShop.buy("朋友帮我");
//---------------------打印日志-------------------------
//System.out: 朋友帮我买面包
-------------------------------2.动态代理模式的简单实现-----------------------------------
- 解释:静态代理是在代码运行前就已经存在了代理类的class编译文件;动态代理是在代码运行时通过反射来动态地生成代理类的对象,并确定到底来代理谁。
Java提供了动态的代理接口InvocationHandler,实现这个接口需要重写invoke()方法,如下:
public class DynamicPurchasing implements InvocationHandler {
private Object mObject;
public DynamicPurchasing(Object o) {
this.mObject = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(mObject, args);
// if (method.getName().equals("buy")){
// System.out.println("。。。");
// }
return invoke;
}
}
最终调用,如下:
MyselfShop myselfShop = new MyselfShop();
DynamicPurchasing dynamicPurchasing = new DynamicPurchasing(myselfShop);
ClassLoader classLoader = myselfShop.getClass().getClassLoader();
IShop shop = (IShop) Proxy.newProxyInstance(classLoader,new Class[]{IShop.class},dynamicPurchasing);
shop.buy("动态代理");
//---------------------打印日志-------------------------
//System.out: 动态代理买面包
2.2.优缺点
- 优点:1⃣️真实主题类就是实现实际的业务逻辑,不用关系其他非本职的工作。2⃣️类的可扩展性比较广。
- 缺点:1⃣️在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。2⃣️实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
2.3.使用场景
- 按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
2.4.注意
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
- 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
3.总结
有疑问可以留言!
4.最后
开通了个公众号,扫码关注一下,可以及时收到我分享的内容哦!