续《android与模式:什么是设计?》http://my.oschina.net/vdroid/blog/205871

前面讲过封装和抽象,抽象可以说是高级的封装,接着讲解耦。

之前说了,为什么需要解耦?

我有这个习惯,在学习的时候,经常问自己问题。

解耦简单来说,就是让两个对象之间的关系简单一些,之前我们将的封装对象,都是单个的,相对独立的,但社会是复杂的,所以对象间也是有很复杂的。独立存在的对象是有意义么?举个最简单的例子,A类需要用到B类的一些方法,那如何实现呢?方法1,A类继承B类,方法2,A类包含有一个B类的对象。在uml中,这两种情况A和B都存在一定关系,但因实现方式不同,他们具体关系紧密度又各有不同。在方法1中,必须有B,A类才能存在,他们是父子关系,如果B类存在变化,则A必然受到影响,可以说非常"亲密"。而方法2中,B类的变化可能会影响A类,而A类的变化则可能与B类无关,这样的关系较方法1明显轻些。由此,我们可以说方法1和方法2两对象间的耦合度是不一样的。

如果有兴趣,对于对象间的关系,可以了解一下uml中的6大关系(关联、依赖、聚合、组合、泛化、实现),可能会帮助你了解一些细节差异,这里不累述。

由上可知,对象间的关系密度不同,对代码的变更会有不同的要求。那么作为一个健壮的设计如何能包容变化,最小的更改原代码,必然会更少隐患和bug,所以我们常说“高内聚,松耦合”就是这意思。

那为什么要解耦呢?我认为有2点,1,代码结构清晰,2复用。

通过包,类名等可以很清楚知道对象的功能和分类,而一个类或者对象如何做到稳定和健壮?这就是对象的复用。

抽象好的对象,松耦合的关系,那么程序在设计上就会越发健壮,具有更好的移植性,那么单个的类的复用性也就更高。

再以之前车的比喻,结合工厂模式为例,总结一下这三点。

首先,假设构造一个对象Car。我们可以这样:

1,

Car{getWeight();getColor();floatgetPrice();intgetPower();intgetAccelerateTime();//百米加速时间intgetWheel();//轮子booleanhasTrailer();//挂车.....}

我们会发现这个类基本是万能的。如果只是针对某一款车,可能也就那样,无所谓抽象。但是我们如果要区分不同的需求,更具不同的客户生成不同的车,那就会很麻烦,增加一个车型就可能需要修改Car类,或者Car类会多出一些无用的方法,我称之为“类冗余"。这是由数据库设计冗余衍生的词,:) 。比如一般私家车不会考虑trailer这个东西,这是载重卡车司机考虑的,而富二代买跑车更关注牌子,马力,这就是存在的变化了。其实类设计和数据库设计有相同之处,看一个类是否容易也可通过转换为一个数据库表,看数据是否冗余而定。

为了说明,我先定义一个工具类。

CarHelper{CarcreateCar();}.

又来一个客户Custom1,他想要一个私家车,CarHelper.createCar();由于他是第一个客户,好吧,就给他造这1个。不久又来了一个客户Custom2,他想要跑车,而且是敞篷跑车。但目前Car没有敞篷这个属性,好吧,为了满足需求,改Car类,添加一个cover属性,helper也不能用,只能,因为这个方法无法判断以后客户是需要私家车还是敞篷跑车,好吧,只能继续改,2种方式:

1,Carhelper添加一个createSportCar();2,修改createCar为createCar(int type),哦,忘了,也许这个时候想起来,最好给Car添一个属性type,来区别car是啥类型的车。

最后生产出了SportCar给Custom2。整个过程,只能说悲催的程序猿。因为,恐惧才刚刚开始,要是客户来买大卡咋办呢?他已经做好了加班的准备了...

显然,这是一个失败的设计,可以加入"累死程序猿" 计划。

<未完待续>





更多相关文章

  1. 关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方
  2. Android中遇到java.lang.NoSuchMethodError: java.io.File.toPat
  3. [置顶] [Android(安卓)Studio 权威教程]断点调试和高级调试
  4. android 3D 游戏实现之First Step
  5. Android(安卓)淘气三千传之 —— 插件化的一点理解(上)
  6. 用AutoCompleteTextView实现历史记录提示
  7. Activity Task 栈及亲缘关系
  8. Android中Handler消息传递机制
  9. Fresco: android上的图像处理库

随机推荐

  1. Android通过adb查看wifi密码
  2. Android(安卓)NDK开发学习(一)
  3. 基于移动平台的多媒体框架——移植Live55
  4. Android中我为什么发不了邮件--Android邮
  5. 别人花了几万元学的Android高级技术,我帮
  6. (三)Android数据结构学习之队列
  7. Android控制闪光灯的方法(打开与关闭)
  8. 详述Google的Android平板App开发准则
  9. 手机或android设备连接电脑,但是adb devic
  10. Android应用程序内部启动Activity过程(sta