GOF(一) 代理模式(Proxy pattern)

匿名 (未验证) 提交于 2019-12-03 00:22:01

核心作用

通过代理,控制对对象的访问。

可以详细控制某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(AOP面向切面的微观实现),从而将统一流程放到代理类中处理。

核心角色

抽象角色定义代理角色和真实角色的公共对外方法。

真实角色实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用。

代理角色实现抽象角色,是真实角色的代理(即,持有对真实角色的引用),通过真实角色的业务逻辑来实现抽象方法,可以附加自己的操作。

分类

静态代理:静态定义代理类

动态代理:动态生成代理类

静态代理的实现

以明星唱歌为例,假设流程如下:面谈――签合同――订票――唱歌(明星本人)――收款

1.定义抽象角色

package Proxy.staticProxy; /**  * 抽象角色:定义代理角色和真实角色的公共对外方法  * @author baka  *  */ public interface Star { 	/** 	 * 面谈 	 */ 	public void confer(); 	/** 	 * 签合同 	 */ 	public void signContract(); 	/** 	 * 订票 	 */ 	public void bookTicket(); 	/** 	 * 唱歌 	 */ 	public void sing(); 	/** 	 * 收款 	 */ 	public void collectMoney(); }

2.定义真实角色

真实角色真正要做的事情就是唱歌

package Proxy.staticProxy; /**  * 真实角色  * 实现抽象角色,定义真实角色所要实现的业务逻辑  * @author baka  *  */ public class RealStar implements Star{  	@Override 	public void confer() { 	 	}  	@Override 	public void signContract() { 	 	}  	@Override 	public void bookTicket() { 		 	}  	@Override 	public void sing() { 		System.out.println("真实角色:明星本人唱歌!"); 		 	}  	@Override 	public void collectMoney() { 		 	} 	 }

3.定义代理角色

package Proxy.staticProxy; /**  * 代理角色  * 实现抽象角色,并且持有真实角色的引用  * 处理统一的控制流程  * @author baka  *  */ public class ProxyStar implements Star{ 	 	private Star star; 	 	public ProxyStar(Star star) { 		super(); 		this.star = star; 	} 	 	@Override 	public void confer() { 		System.out.println("代理角色:面谈"); 	}  	@Override 	public void signContract() { 		System.out.println("代理角色:签合同"); 	}  	@Override 	public void bookTicket() { 		System.out.println("代理角色:订票"); 	}  	/** 	 * 唱歌只能由真实角色来做 	 */ 	@Override 	public void sing() { 		star.sing(); 	}  	@Override 	public void collectMoney() { 		System.out.println("代理角色:收尾款"); 	}  }

4.测试

public class Client { 	public static void main(String[] args) { 		Star real = new RealStar(); 		//代理角色持有真实对象的引用 		Star proxy = new ProxyStar(real);   		 		proxy.confer(); 		proxy.signContract(); 		proxy.collectMoney(); 		proxy.sing(); 		proxy.collectMoney(); 	} }

5.运行结果


我们可以看到,只有唱歌是由明星本人做的,其他事情都是代理角色做的,由此,就实现了静态代理。

未完,待续。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!