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

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

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

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

//相当于迎宾小姐(委托类)
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();
	}

}

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

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

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

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

时间: 2024-12-12 05:03:52

代理模式(静态代理)的通俗理解的相关文章

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

代理模式-静态代理与动态代理

简介 首先感谢沽泡学院 tom 老师 代理模式是一种结构型模式 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会.意会.意会... 静态代理 /** * 一个服务器接口, 服务器有很多功能, 可以用来路由, 建站等... */ public inter

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl

java 设计模式 - 代理模式 - 静态代理

代理模式:使用环境无法直接使用对象A(委托对象),可以使用对象B(代理对象)调用对象A已达到直接调用对象A的效果,就成为代理模式. 其中A为委托对象,B为代理对象. 静态代理的优缺点: 优点: 1.代码只管,可以清楚理解委托雷以及代理类. 2.在编译期加入,提前就指定好了委托类,代理类,效率高. 缺点: 1.静态代理很麻烦,需要大量的代理类,不易于代码维护等 当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试. 2.重复的代码会出现在

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

CGLIB与JDK动态代理区别 区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB

代理模式---静态代理

一,静态代理介绍 了解设计模式中的代理模式的同学应该都知道如果想要为被代理类生成代理,需要让代理类和被代理类共同实现同一个接口,在代理类中增加额外逻辑来实现代理模式,这种方式在编译期间就已经确认了哪个类是代理类,被代理的又是哪个类,这都是需要开发人员在编译之前就编写好的,是为静态 1,代理模型的角色分析 抽象角色:一般会使用抽象类或者接口实现 真实角色:实体类,被代理的角色 代理角色:代理真实角色,而且可以附属一些其他操作 使用角色:使用代理角色进行操作 2,静态代理模式的优点 可以使真实角色更

代理模式(静态代理)(工厂模式9)

//抽想角色定义代理角色与实际角色的对外开放的方法: //真实角色: //代理角色: 代理角色可以做很多东西,但不会做真实角色的独有属性(如唱歌) 只有通过真实角色的应用,调用真实角色方法,才可以真正的对症是角色 的代理: private RealStar realStar; public Proxy(RealStar realStar){ this.realStar= realStar; } 客户: 根据测试结果,只有sing()是本人执行,其他都有代理角色执行 类图:

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

设计模式--5.4 代理模式-动态代理

1.动态代理 (1)动态代理,是实现阶段不关心代理谁,而在运行阶段才指定代理哪一个对象.相对的说,上面两种 普通代理和强制代理,都是通过写代理类来获取代理,这种是静态代理. (2)区别:静态代理,需要写代理类,在代理之前要知道我代理的是哪个类: (3)类图 2.代码 接口类 package com.design.代理模式.动态代理; public interface IGamePlayer { void login(String username , String pwd); void kill