3.对象去耦-代理模式(Proxy)+状态模式(State)+迭代器(Iterator )
对象去耦这个东西是一个很有趣的东西,耦合度是指什么,可能是学习得还不够深入吧,因此当我提及这一概念的时候我心虚了一下,不过我的理解是每个对象与每个对象直接是有关系的,而这种关系如何才能让它去到最弱,很多时候我们会使用接口和基类,对于接口和基类的一个很大的作用就是向上转型,这时候关系就会被减弱,所以很多时候我希望做到的是依赖接口编程,而不是依赖类型编程,做一个比喻,依赖类型,就好比你依赖的那个人是你的父母,而依赖接口(或者更加弱化这个关系)就是你爸爸的爸爸的表叔公的弟弟的儿子的老婆的大姨妈的妹妹的女儿(这个应该是远戚了吧),当这个远戚去变了性,但是对你有影响吗。一点影响也没有,但是如果你爸爸妈妈去变了性,那就大影响了.
代理模式:
这个我记得之前我写过的一篇文章,组合,继承,代理,这是3种方式去复用你的代码,其中个人使用最多的是组合,而代理的好处是什么,比如说一个太空船需要一个控制模块,当你使用组合,那么这个控制类的所有方法变得难以配置,并且经常是暴露出来的,如果使用继承呢,但是概念上会混淆,(接口实现是可以的)。太空船是控制模块的子类,很奇怪,所以我们这里可以使用一种中庸的办法,代理,代理从字面上可以和明星的代理人比较一下,外面很多工作,代理人帮你选择并接,然后他暴露给你的工作就是只有几个,而你需要做的就是从代理人的手中拿工作做,其他并不需要理解与关心,这种思想我觉得和代理模式是很相似的,从这一点,你就可以感受到有一个代理人的好处了吧。
示例
public class spaceship{
private String name;
private SpaceShipControls controls=new SpaceShipControls();
public spaceship(String name){
this.name=name;
}
//后退
public void back(int velocity){
controls.back();
}
//前进
public void forward(int velocity){
controls.forward();
}
....
}
以上就是一个代理类,它可以选择性暴露接口,这是一个很棒的事情,真正需要体验的还是必须要通过实践,我曾经的一个做法就是将代理类改了一下,比如在方法中实现了部分业务逻辑,比如说back(),我会调用controls.back(),但同时我还会加入一下逻辑判断,比如说back的方式,怎么back,还有什么时候back,给不给back现在,这样形成一个back的事务,事务这个词不知道在这里用对不对,不过我觉得这个词真的很精妙,封装性很强,很贴近现实世界的思想.
动态代理(Dynamic Proxies):
这是一个很酷的东西,不过在介绍动态代理之前,我们先对代理模式进行改进,代理模式可以看出缺点不少,当添加新的功能,难免必须增加一个代理类,而代理类依赖于controls,对于系统的扩展性是不好的,这时候我们在想,假如类型是我调用这个代理类的时候我才指定的,然后代理类又根据我给的这个类型去调用相应的方法,那不就解决而来上诉的问题的吗,这个思想很好yeah,一开始是依赖代理类的接口类型的,现在变成了代理类依赖我给的类型了,呵呵,不小心就实现了依赖注入(ioc 依赖倒转)的概念。但是假如代理人变成了代理公司会不会更好呢,这样就不需要每个明星都对应一个代理人,我们可以将入职,审批,等一些相同的工作这些围绕着为明星接工作而核心的周围工作统一起来,而变的只是为明星接工作,这样横向一切面。我们就发现我们成了面向方面编程了(aop),这样管理起来更加方便,而且扩展性增强了,明星只需报上自己是演员还是唱歌的还是主持的,代理公司就会动态生成一个代理(代理公司此时对于该明星来说就是对口的代理人了),然后统一一系列的工作为一方面。这样以后添加明星,就不需要增加代理人,也不需要额外的工作,这就是动态代理的好处了(下次要放在实践中感受一下)
示例
//定义一个接口
public interface people{
public void fuck();
}
//定义一个man
//被代理的对象
public class man implements people{
@Override
public void fuck(){
System.out.println("yeah!,fuck the ***!");
}
public void eat(){
System.out.println("the more you eat,the more you shit!");
}
}
//定义动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/** * the fucking 动态代理类 *
@author shadow * */
public class proxy implements InvocationHandler{
Object target;
public proxy(Object object){ this.target=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("yeah!,还没fuck");
return method.invoke(target, args);
}
public static Object getInstance(Object obj){
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new proxy(obj)); } }
//测试
public class test {
public static void main(String[] args){
people people=(people)proxy.getInstance(new man());
people.fuck();
}
}