简介:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 –《Java与模式》
试想一个场景。我们身边的场景。有个叫华师家教中心的机构,还有一群想在周末做家教挣点零花钱的学生,由于学生们天天忙着上课和写作业,没有时间出去挨家挨户的登门造访询问家长是否需要家教帮忙辅导工作,学生挨家挨户的登门造访询问家长是否需要家教要做的一件事就是“问”。而恰恰家教中心却替代学生们做了这个“问”这件事。这就是代理。在这件是中,有三个角色,一是学生,一是家教中心,还有一个隐藏的角色—定义“问”这个“接口”。以下是代码:
1、接口:
public interface Interface {
void doSomething();
void somethingElse(String str);
}
2、真实的角色,类似上面情景的学生
public class RealObject implements Interface{
@Override
public void doSomething() {
System.out.println("doSomething()");
}
@Override
public void somethingElse(String str) {
System.out.println("somethingElse:"+str);
}
}
3、代理角色(家教中心)
public class SimpleProxy implements Interface{
private Interface proxied;
public SimpleProxy(Interface proxied) {
this.proxied = proxied;
}
@Override
public void doSomething() {
System.out.println("代理里面的doSomething()方法");
proxied.doSomething();
}
@Override
public void somethingElse(String str) {
System.out.println("代理里面的doSomething()方法"); //代理的时候额外做的事情
proxied.somethingElse(str);
}
}
4、测试
public class SimpleProxyDemo {
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse("aa");
}
public static void main(String[] args) {
consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
}
什么时候会用到这种简单的代理模式,就是真实的角色不能直接被外界引用而却能代理角色引用。真实角色和代理角色实现了一个接口这很重要,这成了代理角色能代理真实角色的基础。
好处:
1、解决了真实角色不能直接被外界引用的问题
2、能在代理的时候额外增加一些代码