二十三种设计模式之代理模式(西游记里面竟然也有代理模式?!)

目录

1. 设计模式的分类

2. 引言

3. 代理模式简介

3.1 代理模式的角色

3.2 代理模式的分类

4. 生活中的代理模式

4.1房产中介

5. 代理模式的优点

6. 代理模式的缺点

7. 拓展:动态代理的应用

Java动态代理示例

8. 结语


1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 引言

在软件开发中,设计模式是解决常见问题的模板,它们可以帮助我们构建灵活且可维护的代码。今天,我们将探讨设计模式中的代理模式,并结合生活中的实例来形象地解释它。

3. 代理模式简介

代理模式是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。简单来说,代理模式通过引入一个代理对象来间接访问实际对象,从而在不改变实际对象的基础上,提供额外的功能或控制。

应用实例:

  1. Spring AOP;
  2. 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. 结语

代理模式是一种非常实用的设计模式,它可以帮助我们在不改变原有对象的基础上,增加额外的功能或控制。通过理解代理模式的原理和应用,我们可以在软件开发中更加灵活地解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值