代理设计模式
首先为什么单独介绍这个设计模式,因为这个设计模式实现了SpringAoP的底层原理,后续在Spring的文章中我会提到
设计模式回顾
模式的起源
模式是在特定环境下解决某类重复出现问题的一套成功或有效的解决方案。
每个模式是在特定的环境下才有效,学习模式,除了了解模式本身,还得了解这个模式在什么环境下才能使用
什么是设计模式
- 设计模式(Design pattern)是一套被反复使用、多数人知晓、经过分类编目的代码设计经验的总结
- 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可扩展性和可维护性
- 通用的设计模式有 23 个,每1个设计模式都是某一类典型问题的解决方案
设计模式的本质
设计模式对面向对象设计原则和面向对象三大特性(封装、继承、多态)的灵活应用
23种设计模式
工作中常用的6个设计模式:单例模式、工厂模式、代理模式、观察者模式、策略模式是、责任链模式、模板模式
学习设计模式的误区
设计模式不能滥用:不要以为在任何一个系统中都要使用设计模式,系统也不是套用设计模式越多越好。滥用设计模式将增加系统复杂度,降低系统的可维护性。
特定环境、特定问题、灵活运用
如何正确学习设计模式
学习设计模式五要素如下:
名称:每一种设计模式都有名称,都是经过专门分类编目的,以便于学习交流
问题:每一种设计模式都是某一类典型问题的解决方案
实现:每一种设计模式都有一种或多种代码实现方式(UML类图)
优缺点:每一种设计模式都存在优缺点(没有完美无缺的解决方案)
适用场景:每一种设计模式都有其常见典型的适用场景
代理设计模式
定义
代理模式是为目标对象创建代理对象以提供一种代理机制,让代理对象能控制目标对象的访问,并且可以在不改变目标对象的情况下为目标对象添加额外的功能。
代理模式分类
静态代理:在程序编译期就确定了被代理对象
动态代理:在程序运行期才能确定被代理对象(运用反射机制动态地为目标类创建代理类)(Spring AOP 采用动态代理)
代理模式案例
静态代理:
public interface IDog {
void bark();
void run();
}
public class Hiromi implements IDog{
@Override
public void bark() {
System.out.println("博美在叫");
}
@Override
public void run() {
System.out.println("博美在跑");
}
}
public class Huskie implements IDog{
@Override
public void bark() {
System.out.println("哈士奇在叫");
}
@Override
public void run() {
System.out.println("哈士奇在跑");
}
}
public class DogProxy implements IDog {
private IDog target; //被代理对象
public DogProxy(IDog target) {
this.target = target;
}
@Override
public void bark() {
System.out.println("bark 方法开始执行");
target.bark();
System.out.println("bark 方法执行结束");
}
@Override
public void run() {
System.out.println("run 方法开始执行");
target.bark();
System.out.println("run 方法结束执行");
}
}
public class DogProxyTest {
public static void main(String[] args) {
DogProxy dogProxy1 = new DogProxy(new Hiromi());
dogProxy1.bark();
dogProxy1.run();
System.out.println("------------");
DogProxy dogProxy2 = new DogProxy(new Huskie());
dogProxy2.bark();
dogProxy2.run();
}
}
动态代理:
代理模式的优缺点
优点:
- 代理模式在客户对象和目标对象之间起到一个中介作用和保护目标对象的作用
- 代理对象可以扩展目标对象的功能
- 代理模式能将客户对象与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点:
- 代理模式会造成系统设计中的类数量增加
- 在客户对象和目标对象之间增加一个代理对象,会造成请求处理速度变慢
- 在一定程度增加了系统的复杂度
代理模式使用场景
- 远程代理:为一个位于不同网络计算机的对象提供一个本地的代理(如本地网盘)
- 虚拟代理:如果需要创建一个消耗较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要时才被真实创建(如图片显示)
- 安全代理:用于控制对真实对象的访问权限,以实现权限管理和安全性
- 智能指针:主要用于调用目标对象时,代理附加一些额外的处理功能(如GC垃圾回收)
- 延迟加载:为了提高系统的性能,延迟对目标对象的加载(如MyBatis 的延时加载)