代理模式和外观模式是结构性设计模式,解决了在应用程序架构组织中不同的任务。
代理模式是对象的替代品或“代表”。它的任务是控制访问、缓存、实现延迟加载、调节安全性或分发请求(例如,网络代理、安全代理)。代理模式实现与真实对象相同的契约(接口)。
Java 示例:
public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // 访问检查 realService.operation(); } }
外观模式是一种隐藏子系统复杂性的模式,提供一个统一的简化接口。外观模式不负责控制访问或额外逻辑,它只是聚合调用。
Java 示例:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
使用场景:
关键特点:
外观模式是否允许在子系统的原始类之上添加功能?
不可以,外观只是聚合和简化调用,新的功能由其他模式或新的服务实现。
代理模式是否必须通过目标对象的继承来实现?
不一定,代理实现目标接口,但通常使用组合(封装真实对象),而不是继承。
可以使用外观控制访问或记录错误日志吗?
最好使用代理模式。外观并不旨在内置支持缓存、日志记录或权限检查。