代理模式
原始定义:Proxy pattern provides a surrogate or placeholder for another object in order to controll access to it
宁看懂了吗?
翻译:代理模式就是给某一个对象(被代理对象proxyee)提供一个“替身”或者“占位符”来达到控制这个对象的目的。
我注:也就是说,相比于之前我们直接操作这个对象(proxyee),我们通过操作代理对象(proxyer)来间接的操作proxyee。 这下懂了吧亲?
静态代理
从字面理解,就是有另一个人代替了你去做了本来你应该做的事情(在代码中其实还是你自己做的,这里先不管具体谁做的)。
静态代理模式的优点:
- 在不改变原有代码的前提下增加功能
- 帮助你理解AOP
静态代理模式的缺点: - 代理类必须实现被代理类实现的接口,一旦被代理类的功能增加,会牵扯到代理类的代码。
这里用一个例子来解释静态代理的流程和代码。
我们假设你是蔡徐坤的经纪人,蔡徐坤自己跳舞是赚不到钱的,只有你接到业务让他跳舞他才有收入。
首先我们先创建一个功能接口叫做(如果对这里为什么要使用interface而不是class有疑问,这里是java编程的惯例,一般来讲,功能使用接口,实体使用类)
public interface talent{void dance();void sing();
}
然后我们创建出蔡徐坤,并且实现了他的天赋(talent 接口)
public class CaiXuKun implements talent{@overridepublic void dance(){system.out.println("我是来自美国校队的拉拉队队长,跳麻溜的");}@override public void sing(){system.out.println("鸡你太美");}}
然后我们让蔡徐坤自己表演下才艺(单独运行下他的方法)
public class TestCaixukun {public static void main(String[] args) {CaiXuKun caiXuKun = new CaiXuKun();caiXuKun.sing();caiXuKun.dance();}
然后发现他没有收到钱!!!!!
现在的重点来了,我们要使用经纪人来代理业务了,创建一个代理对象就叫做ProxyManager吧
public class ProxyManager implements talent{CaiXuKun target; //这里我们需要一个CaiXuKun的实例来保证还是caixukun本人在跳舞!!!!public void setTarget(CaiXuKun target) { this.target = target;}@Overridepublic void dance() {System.out.println("跳舞收费五十块 ,请交钱!");//这里就是我们添加的功能了!!!并且我们没有动CaiXuKun的代码!target.dance();}@Overridepublic void sing() {System.out.println("蔡徐坤唱歌收费五十块,请交钱!!!");//这里就是我们添加的功能了!!!并且我们没有动CaiXuKun的代码!target.sing();}
}在这里使用代理类运行一下
public class TestCaixukun {public static void main(String[] args) {ProxyManager proxyManager = new ProxyManager();CaiXuKun caiXuKun = new CaiXuKun();proxyManager.setTarget(caiXuKun);proxyManager.dance();proxyManager.sing();}
}
我们就成功了增加了功能了!!!! 你看懂了吗!!!
现在你回头看上面 代理模式的优点,映象应该会深刻和具体一点