实用的设计模式-代理模式

代理模式

简单来说代理模式就是在不改变原方法(或行为)的前提下对其功能进行扩展。

1、静态代理

//行为接口
public interface IDrive {
    public void drive();
}
//目标类型实现了某个行为
public class Driver implements IDrive {
    @Override
    public void drive() {
    	System.out.println("驾驶中...");
    }
}

如上,驾驶员对象起初只关注驾驶(上车就是干),后来驾驶员意识变强了,驾驶员需要在驾驶前检查车况,但又不能修改原来的代码

//具有同样行为的代理类
public class DriverProxy implements IDrive {
    private IDrive targetDriver;
    public DriverProxy(IDrive targetDriver) {
    	this.targetDriver = targetDriver;
    }

    @Override
    public void drive() {
    	System.out.println("检查车辆。。。");	//添加额外的操作
    	this.targetDriver.drive();	//原操作不变
    	System.out.println("驾驶结束。。。");
    }
}
//测试一下
public class Main {
    public static void main(String[] args) {
    	Driver driver = new Driver();//驾驶员
    	
    	DriverProxy proxy = new DriverProxy(driver);//代理驾驶员
    	proxy.drive();	//执行代理后的驾驶操作
    }
}

以上就是一个简单的静态代理模式的实现,需要注意的是代理类和被代理的类要有同样的行为(即实现同样的接口),代理类要包含被代理对象

2、动态代理(JDK代理)

静态代理的缺点就是当接口发生改变时,代理类和被代理类都要改变,此时就可以使用动态代理来避免这种情况

//生成动态代理对象
public class DriverProxy {
    public static IDrive createDriverProxy(IDrive targetDriver) {
	    IDrive proxy = (IDrive) Proxy.newProxyInstance(targetDriver.getClass().getClassLoader(), targetDriver.getClass().getInterfaces(), new InvocationHandler() {
		  @Override
		  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		   	System.out.println("车辆检查。。。");
		   	Object value = method.invoke(targetDriver, args);
		   	System.out.println("驾驶结束。。。");
		   	return value;
		  }
	    });
	return proxy;
    }
}
//测试一下
public class Main {
    public static void main(String[] args) {
    	Driver driver = new Driver();//驾驶员
    	
    	IDrive driverProxy = DriverProxy.createDriverProxy(driver);
    	driverProxy.drive();
    }
}

注:这两种代理模式都有一个缺点就是目标对象都要实现至少一个行为接口,如果没有的话,可以参考Cglib代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值