代理模式

《大话设计模式》第7读书笔记,介绍代理模式

Posted by GrayWind on October 25, 2018

代理模式

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

proxy-struct

Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

public interface Subject {
	public void request();
}

RealSubject类,定义Proxy所代表的真实实体。

public class RealSubject implements Subject {

	@Override
	public void request() {
		System.out.println("真实的请求");
	}

}

Proxy类保存一个引用使得代理可以访问实体,并且提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体,也就是说由代理来完成对RealSubject实体方法的访问,而不由调用者直接调用,这样相当于调用者不需要知道RealSubject只需要认识代理。

public class Proxy implements Subject {
	private RealSubject realSubject;

	@Override
	public void request() {
		if (realSubject == null) {
			realSubject = new RealSubject();
		}
		realSubject.request();
	}

	public static void main(String[] args) {
		Proxy proxy = new Proxy();
		proxy.request();//真实的请求
	}
}

下面介绍下《大话设计模式》关于代理模式的扯淡案例,有个女生叫李娇娇,有个男生喜欢她,想给她送礼物,但自己不好意思,就拜托他的朋友戴利去送,结果最后女生喜欢上他朋友了。

那么在这个案例中,这位朋友就成为了代理,追求者通过代理来送礼物给被追求者女生

proxy

被追求者类如下

public class SchoolGirl {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

需要由代理完成的动作,也就是送礼物抽象为功能接口

public interface GiveGift {
	public void giveDools();
	public void giveFlowers();
	public void giveChocolate();
}

追求者和被追求者都需要实现GiveGift接口

public class Persuit implements GiveGift {
	private SchoolGirl mm;

	public Persuit(SchoolGirl mm) {
		this.mm = mm;
	}

	@Override
	public void giveDools() {
		System.out.println(mm.getName() + "送你洋娃娃");
	}

	@Override
	public void giveFlowers() {
		System.out.println(mm.getName() + "送你鲜花");
	}

	@Override
	public void giveChocolate() {
		System.out.println(mm.getName() + "送你巧克力");
	}

}

追求者的实例只有代理能够接触到,所以被追求者是不知道追求者实例的,只能知道代理的实例

public class PersuitProxy implements GiveGift {
	private Persuit gg;

	public PersuitProxy(SchoolGirl mm) {
		this.gg = new Persuit(mm);
	}

	@Override
	public void giveDools() {
		gg.giveDools();
	}

	@Override
	public void giveFlowers() {
		gg.giveFlowers();
	}

	@Override
	public void giveChocolate() {
		gg.giveChocolate();
	}
	
	public static void main(String[] args) {
		SchoolGirl jiaojiao = new SchoolGirl();
		jiaojiao.setName("李娇娇");
		
		PersuitProxy daili = new PersuitProxy(jiaojiao);
		
		daili.giveFlowers();
		daili.giveDools();
		daili.giveChocolate();
	}
}

参考资料

《大话设计模式》