java接口的代理模式

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("经纪人收钱");
	}
}

运行结果为

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

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

猜你喜欢

转载自blog.csdn.net/Meloneating/article/details/114249981