为别人做嫁衣 - 代理模式
今天说说我对代理模式的理解,之前也简单了解过代理模式,但是不是很懂它的使用场景,五一的时候想着模仿Mybatis写一个简单版的数据库框架,写之前有一个点一直卡着我,只有一个接口和配置文件,用反射去写的话也应该要一个实现类呀,那多个接口还是需要多个实现类,那还是什么框架呀。。。
后来想起了代理模式,用动态代理帮我去做实现类呀!!!我真是机智,哈哈哈
首先先说一下概念 代理模式:为其他对象提供一种代理以控制对这个对象的访问,这样说太抽象了,反正第一次看我是不懂。
代理分为两种,静态代理和动态代理,我们先说说静态代理,静态代理是由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。举个例子,假设我想实现用户登录成功之后给用户发一个信息提示登录成功,这个应该怎么做呢。太简单了,直接在登录成功方法里面加一个发送信息功能不就好了,如下
上面的实现方式可以实现我们需要的功能,但是有一个问题,假设我需要修改发送短信的实现方式,或者说我现在不发短信了,我发邮件怎么办,这样就需要去修改登录的这个方法,明明只是修改一下登录成功之后的操作,为什么要修改我登录的方法呢?这很明显违反了开放-封闭原则(后面我会补充对开放-封闭原则的介绍),所以这个时候就有静态代理的用武之地了。代码如下
这里就用静态代理实现了登录成功之后发送消息的功能,首先我们需要定义一个接口,这个接口中有一个登录的验证抽象方法,登录的业务类和代理类都需要去实现这个接口,然后登录的业务类的实例需要作为参数传给代理类让代理类帮我们去实现登录,如果登录成功就去发送短信,这样就大大降低了耦合度,我以后不管怎么修改发送短信的方式还是换成别的方式,直接在代理类里面改就好了,我登录的业务完全不受影响,符合开放-封闭原则。
先吃个饭,动态代理晚点继续更