设计模式----代理模式(JAVA)

代理模式

/**
 * 
 */
/**
 * 代理模式
 * 代理模式又叫委托模式,是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。
 * 使用场景
 * 代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是通过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
 * 
 * 代理模式优点
 * 职责清晰:具体角色是实现具体的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,代码清晰。在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
 * 高扩展性:具体角色随时会发生变化,但是只要实现了接口,接口不变,代理类就可以不做任何修改继续使用,符合“开闭原则”。
 * 
 * 代理模式的多种实现方式
 * 静态代理:由程序员创建或特定工具自动生成源代码,再对其进行编译。在程序运行之前,代理类.class文件就已经被创建,代理类和委托类的关系在运行前就确定。
 * 动态代理:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
 * 
 * 总结:
 * 代理模式使用广泛,尤其是动态代理在大型开发框架中,应用较多并且高效。特别是使用AOP,实现代理模式就更方便了,比如使用Spring AOP这样的工具。
 * 
 * 
 * 
 * @author 
 *
 */

场景引入

在校园里向小姐姐表白送礼物,可以找与她熟悉的人作为中介。

不使用代理模式

//不使用代理模式
public class Test1 {
	public static void main(String[] args) {
		Girl girl = new Girl("小美");
		Pursuit xiaoming = new Pursuit(girl);
		xiaoming.Rose();
		xiaoming.Chocolate();
		xiaoming.Dolls();
	}
}
class Girl{
	private String name;
	public Girl(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
class Pursuit{
	Girl girl;
	public Pursuit(Girl girl) {
		this.girl=girl;
	}
	public void Dolls() {
		System.out.println(girl.getName()+" 送你洋娃娃");
	}
	public void Rose() {
		System.out.println(girl.getName()+" 送你玫瑰花");
	}
	public void Chocolate() {
		System.out.println(girl.getName()+" 送你巧克力");
	}
}
/**
 * 问题:
 * 小明和小美并不认识,这样写就成了他们两个人认识,所以需要找一个代理
 */

只有代理

//只有代理
public class Test2 {
	public static void main(String[] args) {
		Girl2 girl = new Girl2("小美");
		Proxy xiaogang = new Proxy(girl);
		xiaogang.Chocolate();
		xiaogang.Dolls();
		xiaogang.Rose();
	}
}
class Girl2 {
	private String name;
	public Girl2(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
class Proxy{
	Girl2 girl;
	public Proxy(Girl2 girl) {
		this.girl=girl;
	}
	public void Dolls() {
		System.out.println(girl.getName()+" 送你洋娃娃");
	}
	public void Rose() {
		System.out.println(girl.getName()+" 送你玫瑰花");
	}
	public void Chocolate() {
		System.out.println(girl.getName()+" 送你巧克力");
	}
}
/**
 * 问题:
 * 只有代理的情况下,变成了代理直接给被追求者送礼物,而不是追求者。
 * 
 */

符合实际的代码

//符合实际的代码
public class Test3 {
	public static void main(String[] args) {
		Girl3 girl = new Girl3("小美");
		Proxy2 xiaogang = new Proxy2(girl);
		xiaogang.Chocolate();
		xiaogang.Rose();
		xiaogang.Dolls();
		
	}
}
class Girl3 {
	private String name;
	public Girl3(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
interface Gift{
	void Rose();
	void Dolls();
	void Chocolate();
}
class Proxy2 implements Gift{
	Girl3 girl;
	public Proxy2(Girl3 girl) {
		this.girl=girl;
	}
	public void Dolls() {
		System.out.println(girl.getName()+" 送你洋娃娃");
	}
	public void Rose() {
		System.out.println(girl.getName()+" 送你玫瑰花");
	}
	public void Chocolate() {
		System.out.println(girl.getName()+" 送你巧克力");
	}
}
class Pursuit2 implements Gift{
	Girl girl;
	public Pursuit2(Girl girl) {
		this.girl=girl;
	}
	public void Dolls() {
		System.out.println(girl.getName()+" 送你洋娃娃");
	}
	public void Rose() {
		System.out.println(girl.getName()+" 送你玫瑰花");
	}
	public void Chocolate() {
		System.out.println(girl.getName()+" 送你巧克力");
	}
}

代理模式结构图

代理模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值