JAVA中的静态代理模式
代理模式就是为其他对象提供一种代理以控制对这个对象的访问;在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
简单理解:中介都知道吧,你想买房子,但是你没时间去找房子,你得上班;但是你找了中介,中介帮你去找房子,找到房子之后,你可以去看房子,看看房子有那些电器。画图表示一下。
因为 我找了中介的原因,所以我和中介都有一个目的,那就是找房子:房子找到了,是中介(代理类)帮我找到的,我(被代理类)自己本身并没有找,但是我可以在找房子这件事中穿插其他的事:比如吃饭(eat)、散步(walk);
把找房子抽象出来,变成一个接口,
声明一个SearchRoomInterface 接口来表示找房子的目的:
声明一个中介类,让中介类实现SearchRoomInterface接口,完成找房子的动作:
声明一个Me类,也要实现SearchRoomInterface的接口,这里的重点事想办法使用中介找房子的方法,把找房子这个事暴露出来,让中介去完成业务
重点在在这里:
private SearchRoomInterface searchRoomInterface;
//构造器的形参列别为Agency类型的参数
public Me(Agency agency) {
//把中介类的agency对象赋值给了 SearchRoomInterface
//因为 Agency 类实现了接口,通过赋值,那么searchRoomInterface就是 Agency类的对象,可以调用Agency的方法
this.searchRoomInterface = agency;
}
最后实现效果:
我们就实现了自己虽然也是想找房子,但是通过代理的方式,让中介去找,把这个业务让中介类去完成。
全部代码:
/*
把找房子的动作抽象成一个接口
*/
public interface SearchRoomInterface {
void searchRoom();
}
/*
声明一下中介这个类,
要找房子所以要实现接口
*/
class Agency implements SearchRoomInterface {
@Override
public void searchRoom() {
System.out.println("拿到用户的请求,中介执行找房子的动作");
}
}
/*
声明一下自己,因为也要找房子所以也要实现接口
*/
class Me implements SearchRoomInterface {
@Override
public void searchRoom() {
//虽然我要找房子,但是中介已经帮我实现了,
// 所以这里要使用到中介类中的找房子的方法
//使用中介的找房子的方法就要存在中介Agency的对象,
//所以我们要拿到这个对象,找房子之前我可以干点其他的,比如说吃饭,散步
eat();
walk();
searchRoomInterface.searchRoom();
}
private SearchRoomInterface searchRoomInterface;
//构造器的形参列别为Agency类型的参数
public Me(Agency agency) {
//把中介类的agency对象赋值给了 SearchRoomInterface
//因为 Agency 类实现了接口,通过赋值,那么searchRoomInterface就是 Agency类的对象,可以调用Agency的方法
this.searchRoomInterface = agency;
}
public void eat(){
System.out.println("找房子之前吃了点饭");
}
public void walk(){
System.out.println("找房子之进行了散步");
}
}