java接口的代理模式


文章内容选自尚硅谷,jdk8,eclipse环境

代理模式介绍

代理模式的优点之一就是安全性,以翻墙为例,在翻墙的时候用到的代理服务器,就是利用境外的服务器代替我们访问外网数据,并且不暴露我们的真实IP,暴露的是代理服务器的IP。

在java实现代理模式中,假如说B来代理A,A叫做被代理类,B叫做代理类,我们要保护的是被代理类。

一般是在代理类B中创建一个 接口的属性 和一个以接口为参数的构造器,利用接口的多态性,在创建代理类的时候给构造器赋被代理类的地址。

示例一

演示代码如下:

package com.atguigu.java1;

public class NetWorkTest {
	public static void main(String[] args) {
		Server server = new Server();
		ProxyServer proxyserver = new ProxyServer(server);
		proxyserver.browse();
	}
}

interface NetWork{
	void browse();
}

class Server implements NetWork{

	@Override
	public void browse() {
		System.out.println("真实服务器来访问");
		
	}
	
}

class ProxyServer implements NetWork{

	private NetWork work;
	
	public ProxyServer(NetWork work){
		this.work = work;
	}
	
	public void check(){
		System.out.println("检查服务器");
	}
	
	@Override
	public void browse() {
		check();
		work.browse();
	}
	
}

运行结果为

检查服务器
真实服务器来访问

可以看出,利用代理服务器来访问数据,其实访问数据的浏览器还是真实浏览器,但对外只暴露代理服务器。

代理服务器的核心就是创建一个接口的构造器,在给代理类赋值的时候,给构造器赋上被代理类对象的地址,然后代理服务器就能调用被代理服务器的方法了。

在代理服务器的重写方法中,不仅能调用代理服务器自身方法,还能调用被代理服务器的实现方法。代理和非代理服务器都重写了接口的browse方法,在非代理服务器的实现(重写)方法browse中,既调用代理服务器本身特有的check方法,也调用被代理服务器的browse方法。这儿主要体现的是接口的多态性。

示例二

尚硅谷还给出 另外一个例子

public class StaticProxyTest {

	public static void main(String[] args) {
		Proxy s = new Proxy(new RealStar());
		s.confer();
		s.signContract();
		s.bookTicket();
		s.sing();
		s.collectMoney();
	}
}

interface Star {
	void confer();// 面谈

	void signContract();// 签合同

	void bookTicket();// 订票

	void sing();// 唱歌

	void collectMoney();// 收钱
}
//被代理类
class RealStar implements Star {

	public void confer() {
	}

	public void signContract() {
	}

	public void bookTicket() {
	}

	public void sing() {
		System.out.println("明星:歌唱~~~");
	}

	public void collectMoney() {
	}
}

//代理类
class Proxy implements Star {
	private Star real;

	public Proxy(Star real) {
		this.real = real;
	}

	public void confer() {
		System.out.println("经纪人面谈");
	}

	public void signContract() {
		System.out.println("经纪人签合同");
	}

	public void bookTicket() {
		System.out.println("经纪人订票");
	}

	public void sing() {
		real.sing();
	}

	public void collectMoney() {
		System.out.println("经纪人收钱");
	}
}

运行结果为

经纪人面谈
经纪人签合同
经纪人订票
明星:歌唱~~~
经纪人收钱

明星和经纪人的例子,创建一个明星的接口,声明了真实明星和经纪人的一些共有方法,然后创建真实明星和经纪人两个实现类,在类中实现接口的方法。经纪人作为代理类,真实明星作为被代理类,经纪人帮真实明星代理了除了唱歌以外所有方法,这些方法是经纪人特有的方法,但是唱歌还得明星自己来唱,但是是通过经纪人来进行代理的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值