您的位置:首页 > 编程语言 > Java开发

java设计模式——装饰者模式(代理模式)

2016-04-09 00:00 459 查看
遵循的原则:类应该对扩展开放,对修改关闭。

装饰者模式:http://blog.csdn.net/lmj623565791/article/details/24269409



这个IEquipDecorator接口可有可无(拓展用),装饰类也可以直接实现IEquip接口。

=======================================================================

代理模式:http://yangguangfu.iteye.com/blog/815787



//接口
public interface Moveable {
void move();
}

//汽车类
public class Car implements Moveable {
@Override
public void move() {
//实现开车
try {
Thread.sleep(new Random().nextInt(1000));
System.out.println("汽车行驶中....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

//汽车类的代理类
public class CarTimeProxy implements Moveable {
public CarTimeProxy(Moveable m) {
super();
this.m = m;
}
private Moveable m;
@Override
public void move() {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶....");
m.move();
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶....  汽车行驶时间:"
+ (endtime - starttime) + "毫秒!");
}
}

=============================================================================

JDK的动态代理:http://ysj5125094.iteye.com/blog/2054620

// 实例化目标对象

Hello h = new HelloImpl() ;

// 实例化InvocationHandler

MyInvocationHandler myInvocationHandler = new MyInvocationHandler(h);

// 根据目标对象生成代理对象

Hello proxy = Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), myInvocationHandler);

注意此处的h必须要有接口,即jdk的动态代理只能对接口产生代理,非接口要使用CGLIB。

内部原理:

代理类proxy有所有的接口里的方法,每个方法的实现都是调用myInvocationHandler的invoke方法:

h.invoke(this,此方法名)

myInvocationHandler持有被代理类,再由myInvocationHandler的invoke通过反射调用被代理类对应的方法。

public void invoke(Object o, Method m) {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶....");
m.invoke(target(持有的被代理类)); //通过这个方法调用被代理类的方法
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶.... 汽车行驶时间:"
+ (endtime - starttime) + "毫秒!");
}

这个invoke是暴露给我们的,所以可以任意在 m.invoke(target)前后加修饰方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: