- interface SellFisher { int sellFish(); }
- public class ConcreteSellFisher implements SellFisher {
- public int sellFish() {
- System.out.println("my fish is delicious!!"); return 10; } }
- public class ProxySellFisher implements SellFisher {
- private SellFisher sell;
- public ProxySellFisher(SellFisher sell) { this.sell = sell; }
- public int sellFish() {
- System.out.println("the fish price higher"); return sell.sellFish()+10; } }
复制代码- 但是如果代理类变成了InvocationHandler了,执行的方法
- 是invoke了,从而变得更加灵活了,请看代码
- public class ProxySellFisher implements InvocationHandler {
- private SellFisher sell;
- public ProxySellFisher(SellFisher sell) { this.sell = sell; }
- public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
- System.out.println("the fish price higher"); return (Integer)method.invoke(sell, args)+10; } }
- public class ClientTest {
- public static void main(String args[]) {
- SellFisher s = new ConcreteSellFisher();
- InvocationHandler p = new ProxySellFisher(s); Object obj = Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);
- ((SellFisher)obj).sellFish(); } }
复制代码 请注意,invoke(Object obj,Method method,Object[] args),这里的第一个参数obj其实可以看作没有用处的,不知道jdk为什么要把它也当作一个参数放这里,methd.invoke()方法,需要把原来的具体实现类作为参数传递进去,method.invoke(obj,args)相当于obj.method(args)
总结,从设计模式的角度讲,大家以后编程中,尽量要面向接口,更通俗一点就是,一个类中使用的别的对象成员变量,最好定义成接口的变量而不是实际实现类的变量 |