代理模式(静态代理)的通俗理解

摘要:
有两种代理模式:静态代理和动态代理。初始代码可以说是代理,但不是模式。该模式注重良好的设计。如果您进一步强调通用性和可扩展性,那么必须提到JDK和cglib的动态代理。这样的代理类应运而生。它们专门用于前处理和后处理,因此委托类可以专注于自己的事情。回到我们程序员的世界,看看那些著名的框架,例如struts 2中的动作调用、休眠的延迟加载和春季的AOP。它们都处于代理模式。虽然它们不再是简单的静态代理,但它们的想法大体相同。

代理模式分为两种:静态代理和动态代理。

首先不谈模式,举一个例子:

       有一队很美丽的妹子,她们都是训练有素的迎宾小姐。平时忙于训练再加上人脉与广告投入不多,生意并不好。于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做。恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐。在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候。现在来模拟一下这个情景。

//相当于迎宾小姐(委托类)
public class HelloWorld {
	public void sayhello(){
		System.out.println("Hello!");
	}
}

//相当于这个礼仪公司(代理类)
public class StaticProxy{
	//持有了迎宾小姐的资源
	private HelloWorld helloWorld = new HelloWorld();
	//迎宾活动
	public void sayhello() {
		//自己的乐队奏乐
		System.out.println("do  something....");
		//迎宾小姐欢迎
		helloWorld.sayhello();
	}
	
	public static void main(String[] args) {
		StaticProxy staticProxy = new StaticProxy();
		staticProxy.sayhello();
	}
}

       可是事情进展的并不顺利,突然听说这些个外宾都会中文,而且其中的重量级人物很喜欢中国传统文化。于是该公司要求礼仪公司立即换掉迎宾小姐,请一队着汉服而且普通话好的来。幸好该队迎宾小姐都是狠角色,各种场面都能应付。

于是我们做如下修改:

//相当于迎宾小姐新阵容
public class HelloWorld2 {
	public void sayhello(){
		System.out.println("您好!");
	}
}
//相当于这个礼仪公司
public class StaticProxy{
	//持有了第二队迎宾小姐的资源
	private HelloWorld2 helloWorld2 = new HelloWorld2();
	//迎宾活动
	public void sayhello() {
		//自己的乐队奏乐
		System.out.println("do  something....");
		//迎宾小姐欢迎
		helloWorld2.sayhello();
	}
	
	public static void main(String[] args) {
		StaticProxy staticProxy = new StaticProxy();
		staticProxy.sayhello();
	}
}

迎宾队伍的老大又想,这样太麻烦了,每次换来换去的折腾不起,倒不如我们再召些人马,加强多元化的训练,使自己的团队能应付各种场面,然后根据需求迅速做出响应。

//专业迎宾团队
public interface IHelloWorld {
	//规定了做什么
	public void sayhello();
}
//第一小队
public class HelloWorldImpl implements IHelloWorld{
	//照着规章去做     说英语
	public void sayhello(){
		System.out.println("Hello!");
	}
}

//第二小队
public class HelloWorldImpl2 implements IHelloWorld {
	//同样是致欢迎   用标准普通话
	@Override
	public void sayhello() {
		System.out.println("您好 !");
	}
}

修改代理类:

//相当于这个礼仪公司
public class StaticProxy{
	//持有了迎宾团队的资源
	private IHelloWorld hello ;
  
	public StaticProxy() {
//招呼迎宾团队准备上场,具体派哪对视情况而定
		hello = new HelloWorldImpl();
        //hello = new HelloWorldImpl2();
	}

	//迎宾活动
	public void sayhello() {
		//自己的乐队奏乐
		System.out.println("do  something....");
		//迎宾小姐欢迎
		hello.sayhello();
	}
	
	public static void main(String[] args) {
		//该公司并不知道有迎宾团队的存在   它只和代理(礼仪公司)接触
		StaticProxy staticProxy = new StaticProxy();
		staticProxy.sayhello();
	}
	
}

    修改后的代码可以说是一个静态代理了,设计模式提倡针对接口编程,而不是针对实现编程,这样可以灵活多变。最开始的代码可以说是一种代理,但不是一种模式,模式讲究的是良好的设计,如果进一步强调通用性和可扩展性,那就不得不提到JDKcglib的动态代理。


从上面来总结一下静态代理:

    有些类由于自己功能有限,需要其他的类做一些工作来辅助完成某些功能,虽然这些辅助工作是必须的,但是委托类却不需要自己去做,一是他没有资源,二是它应该注重自己擅长的事情。这样一些代理类应运而生,它专门做一些事前和善后的处理,让委托类专注于自己的事情。在生活中有很多这样的例子,就像上面的迎宾团队,它的团队训练有素,能力很强,但是它却没有能力去接一些大活儿,这样他可以去找礼仪公司,两者签订合作协议,让礼仪公司出去接活儿,迎宾部分到时候包给该团队去做,这样各得其所。还有就是常常在幕后为明星忙碌的经纪人,他们就是活生生的代理。

    回到我们程序员的世界,看看那些有名的框架,像struts2中的action调用,hibernate的懒加载,springAOP,无不用到了代理模式,虽然不再是简单的静态代理,但是思想大抵如此。我们使用这些框架时,只需要专注自己的业务逻辑部分,其他重复机械的但不得不做的工作交给了这些幕后英雄。




免责声明:文章转载自《代理模式(静态代理)的通俗理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hystrix了解和使用Postman的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Ansible入门

自动操作和维护常识操作和维护工作系统安装物理机、虚拟机包安装、配置、服务启动批处理操作程序发布监控操作和维护级别OS配置物理机PXE、,Cobbler(选择多版本操作系统)虚拟机ImageTemplates配置木偶(ruby)saltstack(python)检查cfengine...

git 系列4(文件提交历史)

1查看文件提交历史记录。如果gitlog命令默认不使用任何参数,gitlog将提交时间中列出的所有更新,最新的更新位于顶部;每次更新都有一个SHA-1校验和、作者的姓名和电子邮件地址以及提交时间。提交说明通过在末尾缩进一段来显示——Stat显示每次更新的文件修改统计信息。您还可以给出几个搜索条件并列出符合条件的提交——提交者只显示与指定提交者相关的提交。...

backgroundsize

当背景大小值为和时,可以设置两个值,也可以设置一个值。当只取一个值时,第二个值相当于auto,但此处的auto不会将背景图像的高度保持在其原始高度,而是与第一个值相同。此外,如果只取一个值,宽度和高度将相同,这相当于背景大小:80%自动。...

可爱猫+python——定制化微信机器人

框架是模拟真实用户操作,只要不违法乱纪,是不用担心账号冻结问题的。...

数据库软考易混淆知识之信息化基础、项目管理

2、 关键路径关键路径是活动图中最长的路径示例:图中显示了软件项目的活动图,其中固定点表示项目里程碑,连接顶点的边表示包含的活动,边上的数字表示活动持续时间的天数,则完成项目的最短时间为()天,活动EH和IJ的放松时间分别为()日。...