什么是代理模式
即Proxy Pattern,23种java常用设计模式之一。代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
笔者理解的代理模式
以上内容来自百度百科,可能童鞋们还是觉得太抽象了,我来用自己的理解通俗的解释一下代理模式以及代理模式的应用场景和好处在哪里.
明星都有经纪人的对吧,经纪人其实就是明星的代理,我们平时可以在微博上跟明星单工通信,偶尔运气好明星还会跟你互动一下,这时候基本没啥代理的事情,但是呢,如果你是以为大老板,想找明星搞点事,咳…,想找明星代言你的产品或者拍一些影视作品的话,一般情况就得找明星代理咯,所以微博上一般写的约我请找某某先森,某某小姐。
扯淡到此为止啦,下面我们用代理模式来实现一下通过代理约明星的案例。
代理模式案例
首先来定义明星有那些方法
/**
* 此接口为明星的方法
* @author Ray
*
*/
public interface IStarMethod {
/**
* 调用此方法可以给明星留言。
* @param message
*/
void leaveMessage(String message);
/**
* 明星拍电影的方法
*/
void makeMovie();
}
然后创建一个明星实例,这里我们就用成龙大哥来演示啦,为表尊重,我用了大哥的本名,大家不要笑,我们在学习呢…(手动滑稽)
/**
* 明星的代理类 == 经纪人
* 给明星留言经纪人不用管
* 但是拍戏的话必须要代理经手了
* @author Ray
*
*/
public class StarProxy implements IStarMethod {
private MovieStar movieStar;
/**
* 构造方法传入明星的实例
* @param movieStar
*/
public StarProxy(MovieStar movieStar) {
super();
this.movieStar = movieStar;
}
/**
* 调用代理的留言方法也就是直接调用明星的方法
*/
@Override
public void leaveMessage(String message) {
movieStar.leaveMessage(message);
}
/**
* 这个方法通知明星接戏,开拍
*/
@Override
public void makeMovie() {
movieStar.makeMovie();
}
/**
* 请明星拍戏是通过代理的这个方法
* 先判断拍戏的片酬,片酬通过当然才会拍戏
* @param money 片酬
*/
public void makeMovie(int money) {
if (money > 100000) {
System.out.println("你的价钱很不错----我是房仕龙的代理");
movieStar.makeMovie(); //通知大哥开始拍戏
} else {
System.out.println("抱歉,朋友,"+money+"块还是看电影吧!----我是房仕龙的代理");
}
}
}
我们来看看代理干了什么事,我们调用代理的留言方法其实也就是直接给大哥留言,所以这并没有什么卵用,代理的功能当然是判断价钱够不够咯,不能让大哥自己数钱多没面子啊,所以要调用makeMovie(int)的方法才能确定明星接不接戏(请忽略大哥的片酬,笔者的算术极差,这么零早已懵逼)。
最后到了激动人心的时刻啦,看我们客户端怎么通过代理搞事.
/**
* 客户端类,调用大哥的代理来拍电影
* @author Ray
*
*/
public class Client {
public static void main(String[] args) {
MovieStar movieStar = new MovieStar();
StarProxy starProxy = new StarProxy(movieStar);
starProxy.leaveMessage("嗨,大哥最近身体好吗");
starProxy.makeMovie(100);
}
}
客户端调用大哥代理给大哥留言,直接就是留言成功了。代理并不会干预大,但是你100块叫大哥拍电影,这…,还是买两张电影票请妹子看吧。
继续传入10000000块,看看什么情况starProxy.makeMovie(10000000);
好啦 ,代理模式其实就是业务的主题类(房仕龙)和代理类(经纪人)都实现了统一方法接口,然后代理类可以增强主题类的一些方法,比如数钱再决定拍戏什么的肯定不用大哥自己搞,不然还叫大哥么 ? 好啦,本次博文到此结束,讲得不好请留言拍砖!下一篇会继续讲解代理模式,利用jdk提供的方法实现动态代理,大家一起进步,谢谢各位。