代理模式(静态代理)

代理模式中,生活中还是比较常见的,但是这次我想举个比较接地气的例子,嘿嘿嘿..虽然有点污,但是个人觉得还算是比较接地气吧,下面就来看看吧.....

水浒传大家应该都看过吧,其中潘金莲跟西门庆是怎么勾搭在一起的,通过王婆对吧,就是因为王婆的牵线搭桥,才让西门庆跟潘金莲勾搭在一起的,那么,我们就可以看成,王婆是潘金莲的代理,西门庆通过访问王婆,得到了潘金莲,做了苟且之事,我们先定义一个接口,叫做 BadWoman

public interface BadWoman {
    //抛媚眼
	void makeEyesWithMan();
    //嘿嘿嘿
	void happyTimeWithMan();
}

 

接着定义一个潘金莲,实现BadWoman接口,作为被代理者,由王婆来代理潘金莲跟谁做苟且之事

public class PanJinLian implements BadWoman {
	@Override
	public void makeEyesWithMan() {
		System.out.println("潘金莲,抛媚眼");
	}

	@Override
	public void happyTimeWithMan() {
		System.out.println("潘金莲...嘿嘿嘿...");
	}
}

 

然后在定义一个王婆,实现BadWoman接口,因为代理者要知道被代理者做什么操作,肯定要实现共同接口来保证能代理者的行为

public class WangPo implements BadWoman {
    //通过多态进行代理
	private BadWoman badWoman;

    //默认给潘金莲代理
	public WangPo() {
		this.badWoman = new PanJinLian();
	}

    //可以替换被代理者
	public WangPo(BadWoman badWoman) {
		this.badWoman = badWoman;
	}

    //调用的是王婆的抛媚眼方法,实际上执行者是被代理者
	@Override
	public void makeEyesWithMan() {
		badWoman.makeEyesWithMan();
	}

    //跟抛媚眼一样
	@Override
	public void happyTimeWithMan() {
		badWoman.happyTimeWithMan();
	}
}

最后,我们在定义一个西门庆,来调用代理者(王婆)跟西门庆做苟且之事

public class XiMenQing {

	public static void main(String[] args){
		System.out.println("呼叫王婆..");
		WangPo wangPo = new WangPo();

		wangPo.makeEyesWithMan();
		wangPo.happyTimeWithMan();
	}
}

可以看到,虽然调用的是代理者王婆,但是实际上执行者是潘金莲,这个西门庆可不知道,他只知道,他调用的是王婆的方法,而且,通过代理模式,我们可以加强对代理者的访问,在代理者调用被代理者行为前,做一些其它的处理,例如: 增加参数处理,打印等等...而且我们要替换代理者也很容易,具体如下

 

我们可以试试替换下王婆的被代理者,由潘金莲变成贾氏,我们定义一个贾氏,也实现BadWoman接口

public class JiaShi implements BadWoman {
	@Override
	public void makeEyesWithMan() {
		System.out.println("贾氏抛媚眼");
	}

	@Override
	public void happyTimeWithMan() {
		System.out.println("贾氏..嘿嘿嘿...");
	}
}

然后西门庆类增加下代码,替换掉王婆默认的被代理者

public class XiMenQing {

	public static void main(String[] args){
		System.out.println("呼叫王婆..");
		JiaShi jiaShi = new JiaShi();
		WangPo wangPo = new WangPo(jiaShi);

		wangPo.makeEyesWithMan();
		wangPo.happyTimeWithMan();
	}
}
扫描二维码关注公众号,回复: 1040687 查看本文章

这样,我们用最小的代价完成了被代理者的替换,而且,代码耦合度低,替换被代理者只需换个实现,而且可以加强被代理者的访问,其它地方的代码都不需要变动,读者说如果你说: 我就需要变动,你打我!  笔者:来,你过来,我给你看个板砖,你那么多地方要变动,改不死你,面向接口编程的原则你忘了?最后是UML类图

到这,文章就结束了!

以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流

欢迎转载,请注明出处跟作者,谢谢!

猜你喜欢

转载自my.oschina.net/u/2278977/blog/1417937