首先看看什么是代理模式。
一 代理模式
使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法
二 静态模式
要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:
Cilent调用Source的method()方法,实际上是Proxy来调用method()方法,静态代理中Source跟Proxy都要实现接口Sourceable。
三 测试
首先是父接口 Animal.java
package com.lxj.proxy;
public interface Animal {
public void action();
public void breath();
}
Cat.java
package com.lxj.proxy;
//被代理类Cat
public class Cat implements Animal{
@Override
public void action() {
System.out.println("喵喵喵~~~~");
}
@Override
public void breath() {
System.out.println("猫式呼吸法~~~~");
}
}
CatProxy.java
package com.lxj.proxy;
//代理类
public class CatProxy implements Animal{
//真正要代理的类
Cat cat;
public CatProxy(Cat cat){
this.cat = cat;
}
@Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
//实质上在代理类中是调用了被代理实现接口的方法
cat.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
}
@Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
cat.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
}
}
TestStaticProxy.java
package com.lxj.proxy;
public class TestStaticProxy {
public static void main(String[] args) {
//被代理的类Cat,Cat实现了Animal接口
Cat cat = new Cat();
//代理类CatProxy,也实现了Animal接口
CatProxy catProxy = new CatProxy(cat);
//代理类来调用方法,实际上调用的是Cat的action(),breath()方法
catProxy.action();
catProxy.breath();
}
}
运行结果如下:
从运行结果可以看到其实执行的是被代理类的对象.
从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:
Dog.java
package com.lxj.proxy;
//被代理类 Dog
public class Dog implements Animal {
@Override
public void action() {
System.out.println("汪汪汪~~~~~");
}
@Override
public void breath() {
System.out.println("狗式呼吸法~~~~");
}
}
DogProxy.java
package com.lxj.proxy;
//Dog的代理类
public class DogProxy implements Animal {
Dog dog;
public DogProxy(Dog dog) {
this.dog = dog;
}
@Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
}
@Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
}
}
TestStaticProxy.java
package com.lxj.proxy;
public class TestStaticProxy {
public static void main(String[] args) {
Cat cat = new Cat();
CatProxy catProxy = new CatProxy(cat);
catProxy.action();
catProxy.breath();
Dog dog = new Dog();
DogProxy dogProxy = new DogProxy(dog);
dogProxy.action();
dogProxy.breath();
}
}
运行结果如下:
每次我要新加入一个实现Animal接口的对象的话,都要重新创建一个代理对象,这样会非常的麻烦,这其实是静态代理的缺点,动态代理请看下一篇博客。