首先看看什么是代理模式。
一 代理模式
使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法
二 静态模式
要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:
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(); } }
运行结果如下: