目录
1. 设计模式的分类
创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。
2. 引言
在软件开发中,设计模式是解决常见问题的模板,它们可以帮助我们构建灵活且可维护的代码。今天,我们将探讨设计模式中的代理模式,并结合生活中的实例来形象地解释它。
3. 代理模式简介
代理模式是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。简单来说,代理模式通过引入一个代理对象来间接访问实际对象,从而在不改变实际对象的基础上,提供额外的功能或控制。
应用实例:
- Spring AOP;
- Windows里面的快捷方式;
西游记里的代理模式:
猪八戒去找高翠兰结果是孙悟空变的。可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
3.1 代理模式的角色
- Subject(主题接口):定义了RealSubject和Proxy的公共接口。
- RealSubject(真实主题):实现了Subject接口的真实对象。
- Proxy(代理主题):内部含有对RealSubject的引用,实现了Subject接口,并可以添加额外的处理逻辑。
3.2 代理模式的分类
- 静态代理:在代码编译时就已经确定代理类和目标类的关系。
- 动态代理:在代码运行时,通过反射机制动态创建代理类。
4. 生活中的代理模式
4.1房产中介
假设你想要购买一套房子,但直接与卖家交易可能会很复杂,涉及到许多法律和财务问题。这时,你可以找一家房产中介公司来代理这个过程。
- 主题接口(Subject):购房过程。
- 真实主题(RealSubject):卖家。
- 代理主题(Proxy):房产中介。
过程:
- 你(客户)向房产中介(代理)表达购房需求。
- 房产中介(代理)帮你找到合适的房源(真实主题),并处理所有的法律和财务事务。
- 房产中介还可以在交易前后提供额外的服务,比如房屋检查、贷款咨询等。
5. 代理模式的优点
- 控制访问:可以在不修改真实对象的基础上,通过代理对象来控制对真实对象的访问。
- 增加额外的处理:可以在访问真实对象前后增加额外的处理逻辑,如日志记录、权限检查等。
- 延迟初始化:代理可以在需要时才创建真实对象,从而延迟对象的初始化。
- 保护和隐藏对象:代理对象可以隐藏真实对象的实现细节,保护对象不被外部直接访问。
6. 代理模式的缺点
- 增加系统的复杂度:引入代理对象可能会增加系统的复杂度。
- 可能影响性能:代理对象的额外处理可能会影响系统的性能。
7. 拓展:动态代理的应用
在Java中,动态代理是一个非常强大的功能,它允许我们在运行时动态地创建代理类。这在需要动态地为一组类生成代理时非常有用,比如在AOP(面向切面编程)中,我们可以通过动态代理来实现横切关注点的分离。
Java动态代理示例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyExample {
interface Service {
void execute();
}
static class RealService implements Service {
@Override
public void execute() {
System.out.println("Executing service operation");
}
}
static class ProxyService implements InvocationHandler {
private final Object target;
public ProxyService(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public static void main(String[] args) {
Service realService = new RealService();
Service proxyService = (Service) Proxy.newProxyInstance(
realService.getClass().getClassLoader(),
new Class[]{Service.class},
new ProxyService(realService)
);
proxyService.execute();
}
}
在这个例子中,我们创建了一个Service
接口和一个实现了Service
接口的RealService
类。然后,我们使用Proxy.newProxyInstance
方法动态地创建了一个代理类,并在代理类中添加了额外的逻辑。
8. 结语
代理模式是一种非常实用的设计模式,它可以帮助我们在不改变原有对象的基础上,增加额外的功能或控制。通过理解代理模式的原理和应用,我们可以在软件开发中更加灵活地解决问题。