设计模式

在日常的开发过程中,我们经常需要对某个类或者接口的方法进行增强,我们一般的方式有5种. 继承.实现,静态代理,动态代理,字节码增强.

下面分享设计模式之装饰者和动态代理模式的区别.下面先看一个demo

/下面的代码体现
-------------------------------------
public interface Car { 这是父接口
public void run ();
public void jup();
========================================}
public class CarImpl implements Car { 这是该接口的实现类.里面实现了接口的所有的方法.
@Override
public void run() {
System.out.println("pao");
}
@Override
public void jup() {
System.out.println("tiao");
}
====================================================
public class MyCar implements Car { 这是静态代理类,也就是我们需要增强方法的类
private Car car; 这是成员变量.
public MyCar(Car car) {
this.car = car; 这是给成员变量赋值.
@Override
public void run() {
car.run(); //这是保留原有的方法
System.out.println("飞");//这是将原方法进行增强
@Override
public void jup()
car.jup();//我们不需要增强该方法.就通过传入的对象调用原来的方法.
 
}
======================================================
下面是测试方法.
Car car=new CarImpl(); 通过多态的方法,创建接口.
// 创建mycar对象
MyCar myCar = new MyCar(car); 传入这个对象.
myCar.run(); 最后必须是增强类调用原接口的所有方法.
myCar.jup();
======================================================================================================
public class Main {
public static void main(String[] args) {
final Car car = new CarImpl();
// 通过该对象,反射获取一个动态增强的类对象
* 下面的参数1 Main.class .getClassLoader() 是通过本类对象获得一个类加载器(因为都是同一个类加载器)
* 类加载器的作用是将动态创建出的类加载进虚拟机里面
* 参数2 car.getClass().getInterfaces() 通过接口类的class属性间接获取它里面的所有的接口
* 参数3 通过InvocationHandler 对方法进行增
Car PrxoyCar = (Car) Proxy.newProxyInstance(Main.class.getClassLoader(), car.getClass().getInterfaces(),
new InvocationHandler() {
//参数1 是这个增强的对象.一般没有用处.
//参数2是当前调用的方法对象.
//参数3 是该方法需要的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 假如我们只想增强run方法.
if (method.getName().equals("run")) {
// 进行增强的方法
System.out.println("增强");
}
// 不需要增强的就通过反射调用invoke方法.注意的是对象是原来的对象.
return method.invoke(car, args);
}
});
PrxoyCar.run(); // 注意的是每次调用方法的时候进进入上面的代码一次.
PrxoyCar.jup();
===================================================================
下面分析一下二者的区别
相同点都是需要实现一个父接口.
区别是:静态代理类是已经创建出了,而动态代理类是调用的时候动态创建的.假如我们需要增强多个类的方法的时候,动态代理就体现出优势了哦.
以上都是我的个人见解,请大神指点
 
 
 

 

posted on 2017-11-14 20:32  傲余  阅读(160)  评论(0)    收藏  举报

导航