本人之前学的java web,后来转的android方向,发现写android的人都是天才,其中很多也应用到了java设计模式,说起java设计模式,大家都能说出几个,比如android中application(单例模式)、众多的监听器(观察者模式),众多的适配器adapter(适配器模式)、处理图像的工厂模式……等等,可是大家有没有自己去实现乃至去用这些良好的设计模式来设计自己的代码呢?很多答案是否定的。但是仔细一想,只有遵循“只有写出来才是自己的”的口号,所以今天就来一步一步来写了……学习我快乐!
今天我实现的是代理模式:
首先我写了一个接口类:
public interface Sourceable {
public void method();
}
下面写一个实现这个接口的类:
public class Source implements Sourceable {
@Override
public void method() {
System.out.println("the original method!");
}
}
然后我写了一个代理类:
public class Proxy implements Sourceable {
private Source source;
public Proxy(){
super();
this.source = new Source();
}
@Override
public void method() {
before();
source.method();
atfer();
}
private void atfer() {
System.out.println("after proxy!");
}
private void before() {
System.out.println("before proxy!");
}
}
接下来我们就可以测试了:
public class ProxyTest {
public static void main(String[] args) {
Sourceable source = new Proxy();
source.method();
}
}
测试结果:
before proxy!
the original method!
after proxy!
大家仔细看代码,原类中的method()方法中执行的动作在Proxy类中method()方法中被执行了。想必大家到这已经很明白了。个人感觉有点接口回调的意思。
可能你就问了,这代理模式有什么用呢?android中有没有用到代理模式呢?答案是肯定的,大家记得进程中通信吧,Activity和service间的通信,很多教科书上说Activity和service间跨进程通信,他妈的其实就是瞎说,如果不做任何处理,Service和Activity本在同一进程中,如果service要单独开一进程,需要在配置service的时候加上android:process:romote。这时候就是跨进程通信了,这是一些题外话,如果做到跨进程通信,大家肯定想到的是aidl,aidl其实就是代理模式,大家可以根据上述所写思考一下吧。不免啰嗦一下,下面一段是网上的博客原话。
代理模式的应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。