浅谈代理模式--Proxy

转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51621997

一,代理模式的基础知识

简写:Proxy

解释:为其他对象提供一种代理以控制对这个对象的访问

基本情况:在某些情况下,一些客户不能或者不想直接引用某个对象,就可以利用代理(中介)来实现

二,组成部分:一般由3部分组成

(1)抽象角色:通过接口或抽象声明真实角色实现的业务方法。

(2)代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
(3)真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

如·下图所示:




抽象角色====Subject

代理角色====Proxy

真实角色====RealSubject


三,优点:

(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性


四,例子:

例子1:男孩代理追女孩例子:


女孩类:SchoolGirl

public class SchoolGril {
	private String name;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name = name ;
	}

}


抽象角色:GiveGift

/**
 * 接口,给追求者和代理者实现,定义需要调用的方法
 * @author maiyu
 *
 */
interface GiveGift {
	void GiveDolls();
	void GiveFlowers();
	void GiveChocolate();

}

真实角色Pursuit.class

/**
 * 追求者,实现GiveGift接口,重新其方法
 * @author maiyu
 *
 */
public class Pursuit implements GiveGift {
	SchoolGril girl ;
	public Pursuit(SchoolGril girl){	//用于设置想要追求的对象
		this.girl = girl;
	}

	public void GiveDolls() {
		System.out.println(girl.getName() + " , 送你大抱熊");

	}

	public void GiveFlowers() {
		System.out.println(girl.getName() + " , 送你玫瑰花");

	}

	public void GiveChocolate() {
		System.out.println(girl.getName() + " , 送你巧克力");

	}
}

代理角色:Proxy.class

/**
 * 代理者,实现GiveGift接口,重写其方法
 * @author maiyu
 *
 */
public class Proxy implements GiveGift {
	Pursuit boy;
	public Proxy(SchoolGril girl) { //设置男孩要追求对象名字
		boy = new Pursuit(girl);
	}

	/**
	 * 分别调用男孩要送的礼物和表达的内容
	 */
	public void GiveDolls() {		
		boy.GiveDolls();

	}

	public void GiveFlowers() {
		boy.GiveFlowers();

	}

	public void GiveChocolate() {
		boy.GiveChocolate();

	}

}

测试类:

public class Test {
	public static void main(String[] args){
		
		SchoolGril girl1 = new SchoolGril();		//创建女孩对象
		girl1.setName("小薇");						//命名小薇
		
		Proxy daili = new Proxy(girl1);				//生成男孩要追求的对象
		daili.GiveDolls();							//内容
		daili.GiveFlowers();
		daili.GiveChocolate();
	}
}

输出结果:

小薇 , 送你大抱熊
小薇 , 送你玫瑰花
小薇 , 送你巧克力



例子2:

抽象角色:Italk

/**
 * 定义一个接口,以供实现
 * @author maiyu
 *
 */
public interface Italk {

	public void talk(String msg);

}

真实角色:people

/**
 * 真实角色,实现Italk接口
 * @author maiyu
 *
 */
public class People implements Italk {
	public String username; //名字
	public String age;		//年龄
	//两个get方法和set方法
	public String getName() {
		return username;
	}
	public void setName(String name) {
		this.username = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}

	//初始化名字和年龄的方法
	public People(String name1, String age1) {
		this.username = name1;
		this.age = age1;

	}

	//重写talk方法
	public void talk(String msg) {
		System.out.println(msg + "!你好,我是" + username + ",我年龄是" + age);
	}

}

代理角色:

/**
 * 代理角色:实现Italk接口
 * @author maiyu
 *
 */
public class TalkProxy implements Italk {
	private Italk talker;	//接口
	public TalkProxy(Italk talker) {
		this.talker = talker;
	}
	//重写talk方法
	public void talk(String msg) {
		talker.talk(msg);
	}

	public void talk(String msg, String singname) {
		talker.talk(msg);
		sing(singname);
	}
	//增加sing方法
	private void sing(String singname) {
		System.out.println("唱歌:" + singname);
	}

}

测试:

public class Test {

	/**
	 * 测试
	 * @param args
	 */

	public static void main(String[] args) {

		// 不需要执行额外方法的

		People person = new People("小李飞刀", "40");

		person.talk("没有代理");

		System.out.println("-----------------------------");

		// 需要执行额外方法的

		TalkProxy talker = new TalkProxy(person);

		talker.talk("有代理:", "行百里者半九十");

	}

}

输出结果:

没有代理!你好,我是小李飞刀,我年龄是40
-----------------------------
有代理:!你好,我是小李飞刀,我年龄是40
唱歌:行百里者半九十




五,代理模式的种类:

(1)远程代理:就是为一个对象在不同地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实,

     如访问外网

(2)虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,如网页图片的缓存

(3)安全代理:用来控制真实对象访问时的权限。

(4)智能指引:指当调用真实的对象时,代理处理另外一些事。

   ........... 等等,







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值