代理是我们常常听到的词,无论是网络代理还是现实生活中的校园代理之类的词。
什么是代理?网络代理,我们可以通过代理来间接访问一些不能访问的网站;校园代理,我们通过其购买一些厂商提供的东西、等等等。
而代理模式就是类似于这种作用的一种模式。通过代理模式来对一些对象的方法进行控制、额外操作。
下面展示一个代理的例子:
方法接口:
public interface IInternet {
public void gotoGoogle();
}
实现访问谷歌的方法,但是没有代理是无法访问的:
public class AccessNetworks implements IInternet {
public void gotoGoogle() {
System.out.println("不能直接访问谷歌");
}
}
这时,我们就需要一个代理类来帮助我们访问:
public class ProxySettings implements IInternet {
AccessNetworks accessNetworks;
public ProxySettings(){
<span style="color:#FF0000;">accessNetworks = new AccessNetworks();</span>
}
public void gotoGoogle() {
accessNetworks.gotoGoogle();
settings();
settingAfter();
}
private void settings(){
System.out.println("通过代理进行设置");
}
private void settingAfter(){
System.out.println("成功访问google");
}
}
测试:
public class ProxyTest {
public static void main(String[] args) {
IInternet internet = new ProxySettings();
internet.gotoGoogle();
}
}
结果:
不能直接访问谷歌
通过代理进行设置
成功访问google
例子很简单,展示了一下代理模式的基本使用。但是我们发现。他和装饰模式很像,但是它与装饰模式有一个很大的区别,装饰模式装饰的对象是暴露出来的,而代理类中控制的方法对象是在代理类中固定的,并不是我们通过构造函数传入的。就像我们使用网络代理,通过代理商购物,我们并不关心代理是如何代理的,而且这个对象是固定的。而装饰模式作用是给一个对象增加一些新的功能,而且是动态的。这就要求对象不断的改变。这是代理模式和装饰者模式显著的不同。
Android中,第三方框架
PullToRefreshListView
对LoadingLayout的操作,便使用了代理类:LoadingLayoutProxy,大家可去研究一下