设计模式学习笔记——07 代理模式

代理模式

代理模式可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
在这里插入图片描述

代理模式分三种,普通代理,强制代理,动态代理

普通代理
下面模拟了普通代理,通过代理实例访问被代理对象

package proxy;

public interface BookSell {

	public void sell();
}

package proxy;

public class RealBookSell implements BookSell{

	@Override
	public void sell() {
		System.out.println("付款");		
	}

}

package proxy;

public class BookSellProxy implements BookSell {
	
	RealBookSell rbs = new RealBookSell(); 

	@Override
	public void sell() {
		discount();
		this.rbs.sell();
		gift();

	}
	
	public void discount(){
		System.out.println("打折");
	}
	
	public void gift(){
		System.out.println("赠送购物券");
	}

}

package proxy;

public class Client {

	public static void main(String[] args){
		BookSellProxy bsp = new BookSellProxy();
		bsp.sell();
	}
}

强制代理:
同普通代理是相反的,通过被代理实例找到代理实例进行访问,如下代码中,在客户端是先创建被代理对象,然后通过被代理对象得到代理对象进行处理。否则不能处理。

package proxy;

public interface BookSell {

	public boolean sell();
}

package proxy;

public class RealBookSell implements BookSell{
	
	BookSell bsProxy = null;

	@Override
	public boolean sell() {
		if(!this.isProxy()){
			System.out.println("付款失败,没有指定代理类访问");
			return false;
		}
		System.out.println("付款");	
		return true;
	}
	
	public BookSell getProxy(){
		this.bsProxy = new BookSellProxy(this);
		return bsProxy;
	}
	
    public boolean isProxy(){
    	if(null != bsProxy){
    		return true;
    	}
    	return false;
    }
}

package proxy;

public class BookSellProxy implements BookSell {

	BookSell bs = null;
	public BookSellProxy(BookSell bs){
		this.bs = bs;
	}
	
	@Override
	public boolean sell() {
		discount();
		boolean b = this.bs.sell();
		if (!b) {
			return false;
		} else {
			gift();
			return true;
		}
	}

	public void discount() {
		System.out.println("打折");
	}

	public void gift() {
		System.out.println("赠送购物券");
	}

}

package proxy;

public class Client {

	public static void main(String[] args){
//		BookSellProxy bsp = new BookSellProxy();
//		bsp.sell();
		RealBookSell rbs = new RealBookSell();
		BookSell bs = rbs.getProxy();
		bs.sell();
	}
}

动态代理:
动态代理指实现阶段不知道代理哪个对象,等到运行时才知道代理哪个对象。
上述代理称为静态代理,面向切面编程也就是AOP,核心采用了动态代理机制。
InvocationHandler是JDK提供的动态代理接口,下面将上面的静态代理用动态代理的方式实现下:

package proxy;

public interface BookSell {

	public boolean sell();
}

package proxy;

public class RealBookSell implements BookSell{

	@Override
	public boolean sell() {
		System.out.println("付款");	
		return true;
	}
}

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class BookSellHandler implements InvocationHandler{

	private BookSell bs = null;
	public void setTarget(BookSell bs){
		this.bs = bs;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		discount();
		Object result = method.invoke(bs, args);
		if(result instanceof Boolean){
			gift();
			return result;
		}
		System.out.println("付款失败");
		return result;
	}
	
	public void discount(){
		System.out.println("打折");
	}
	
	public void gift(){
		System.out.println("赠送购物券");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值