Java代理模式之静态代理模式(Static Proxy)详解

1.定义

代理模式为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。

2.举例说明

现实生活中有许多与Java静态代理模式相仿的例子
先从名称看来,代理,就比如生活中的各种中介,房地产中介,婚庆公司,留学机构等等。当我们有买房需求,结婚需求,留学需求等等,就去找中介来帮助我们,此时我们就是顾客。然而在买房,结婚,留学的过程中,有许多事情不是我们自己所必须要做的,比如找婚庆司仪,递交留学申请材料等等,这些小的事情可以交给中介公司帮我们解决,而我们只需要关注我们需要做的。中介公司的存在从某些意义上来说,可以使我们更好的、更加专注的完成我们的工作。

3.代码组成部分

(1)接口:主题

(2)代理类

(3)被代理类

实现方式:代理类和被代理类要实现同一个主题接口,而且代理类中要有一个被代理类的属性,这样才能把核心业务逻辑交还给被代理类完成;而一些与核心业务逻辑无关的逻辑,并且需求是多变的,那么这些逻辑就可以交给代理类来完成

4.以申请学校为例具体讲解

假如我们需要申请国外大学,每个大学不同专业有不同的申请要求,我们在申请学校时一般会寻求中介的帮助,我们自己需要做的是努力提高平均成绩,努力提高雅思成绩,写好Personal Statement等,以满足我们所申请大学的入学要求。而中介所需要做的是帮助我们申请,比如中介可以帮我们打印雅思成绩单,翻译PS,打印高中成绩单等等

接口:ApplyUniversity

package com.proxy;

public interface ApplyUniversity
{
	 public void iELTS();
	 public void personalStatement();
	 public void grade();
}

代理类:Agent
代理类中覆写了接口中的方法,也有自己的方法copyIELTS(),translatePS() ,copyGrade()。然而这三个方法,是Student不关心的,但是这三个方法又是帮助Student完成核心任务(申请学校)的方法。在Agent类中定义了接口类型的属性apu与构造方法,方便接收后期传入的实际参数。

package com.proxy;

public class Agent implements ApplyUniversity
{
	private ApplyUniversity apu;
	public Agent( ApplyUniversity apu) {   //apu作为一个形参传入构造器中
		this.apu=apu;    //相当于ApplyUniversity apu =new UniversityOfBirmingham();
	}
	@Override
	public void iELTS()
	{
		
		apu.iELTS();
		copyIELTS();
		
	}
	@Override
	public void personalStatement()
	{
		
		apu.personalStatement();
		translatePS();
		
	}
	@Override
	public void grade()
	{
		
		apu.grade();
		copyGrade();
		
	}
	public void copyIELTS() {
		System.out.println("打印IELTS成绩单");
	}
	public void translatePS() {
		System.out.println("翻译Personal Statement");
	}
	public void copyGrade() {
		System.out.println("打印高中成绩单");
	}

}

被代理类:UniversityOfBirmingham
实现了ApplyUniversity接口,iELTS(),personalStatement(),grade()这三个方法是申请学校必须需要的。但是代理类中的,copyIELTS(),translatePS(),copyGrade()是学生没必要做的,由代理类来完成。

package com.proxy;

public class UniversityOfBirmingham implements ApplyUniversity
{

	@Override
	public void iELTS()
	{
		System.out.println("IELTS: Total>=7");
		
	}

	@Override
	public void personalStatement()
	{
		System.out.println("PS:A+");
		
	}

	@Override
	public void grade()
	{
		System.out.println("Average Grade: A");
		
	}

}

测试类:

package com.proxy;

public class Student  
{

	public static void main(String args[]) {
		//被代理者对象
		UniversityOfBirmingham uob = new UniversityOfBirmingham(); 
		//代理者对象
		Agent a =new Agent(uob); //传入被代理者对象
		a.iELTS();
		a.personalStatement();
		a.grade();
		
	}
}

Output:

IELTS: Total>=7
打印IELTS成绩单
PS:A+
翻译Personal Statement
Average Grade: A
打印高中成绩单

总结一下:
如果我们自己来申请学校的话,需要做到IELTS: Total>=7,打印IELTS成绩单,PS:A+,翻译Personal Statement,Average Grade: A,打印高中成绩单。但是有了代理类,代理类帮我们完成打印IELTS成绩单,翻译Personal Statement,打印高中成绩单,我们只需要做到IELTS: Total>=7,PS:A+,Average Grade: A即可。我们的核心任务是申请学校,代理类帮我们简化了申请过程,减少麻烦。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值