小谈OO面向对象设计

为什么写这篇文

前言:要小结一段时间的工作内容,总得写点东西,又不想在本篇文中写有关技术的。

经过一番思考,选择了技术人员中,可以作为一项长期值得去学习、可以当做

一种思想的、偏向于设计方面的主题:OO面向对象设计。本文将不会大幅的写23种设计模式,这样写的话,一篇文章是概括不完的,将会侧重另一个相关的东西:设计原则。

为什么要了解设计模式

开发中,处处可以看到设计模式:spring中的单例、java io中的装饰模式、web项目中业务逻辑层可以看做是dao的门面(门面模式)、一种在项目中可能是最简单也比较容易理解的模板方法模式(下面会有应用场景使用到)、aophibernate懒加载用到的代理、web

Filter、项目中经常使用的拦截器机制(责任链模式)、java iterator(迭代模式)

为什么要OO面向对象设计

应用场景:想象这样一种场景,在你的程序中,需要对不同的Html(或者word)进行一些处理,你会怎么做,可能会出现下面的做法(非真实代码,以下出现代码的地方都是模拟的代码,真实工作中是有类似的代码的):

Map<String,String> handleUrl(String url){

String content = HttpClient.post(url);//使用HttpClient请求url

//do something ${content}对页面内容进行各种处理

 

return map;

}

这个方法的代码,它的本意还是可取的,它是试图在一个方法中完成对各种不同格式的html进行处理。在我看到的这段对不同html格式进行抽取的方法,已经是相当长了(因为要处理很多种不同的情况)。让我们来看看上面的代码中,存在的可能有下面不足的地方:

1太过面向过程化,所有抽取url的动作都交由一个方法来处理

2违反单一职责原则(这下面会提到),由于各种不同格式的html都只由一个方法处理了,必定会造成方法的职责不清晰。

那么合理的做法应该是怎样的,个人在处理这个问题是这样分析的:

1每个url抽取之后调用者关注的数据是相同的,比如代码中的resultMap

2对于url抽取之后对内容的处理可能是大同小异,相差不了多少的,可以考虑使用模板方法模式

3每个不同风格的Html的处理方式肯定不是一成不变的,因此假如要对3种不同的html进行处理,那么最好有3个子类(包含模板父类在内就是4个了,这样做是有好处的,可以把所有有关变化的部分都封装到子类中)

前面谈到了一些对问题的分析,现在在我个人的日常开发中,不再倾向于完全面向过程式的去分析问题,而偶尔会从面向对象的角度去分析(也就是完全这件事情,我们需要写多少类)。也由此看出面向对象设计比较适用的一个场景:在日常开发中,总会有一些开发,是可重复的。也可以说,总会遇到说某个领域的一些问题,解决方案是大同小异的(如上文提到的html文件抽取问题),这个时候就比较需要使用面向对象式的分析和设计了。

何为模板方法设计模式

在前面的介绍当中,大概提及了一下模板方法模式。在这段时间的工作学习中,也是有在自己的代码中应用到了模板方法模式,这里粗略的给各位看官介绍一下(如前文所说,全介绍23种设计模式肯定不是合适的,所以此处就自己使用过的来介绍一下。)

简介:定义一个操作中所有步骤的骨架,而将一部分操作延迟到子类中(简单来讲,就是子类在某种情况下,可以操作父类)。模板方法模式是编程中可能需要经常涉及到的一个模式,也是一个比较简单的设计模式,只要在编程中使用了抽象类,那么就有可能见到模板方法模式的影子。在前文提到的关于html抽取的处理,或多或少使用模板方式是比较合适的(抽取html的逻辑是大同小异的,变化的地方,就是如何使用正则或者其它技术抽取我们想要的内容,每个html抽取的正则肯定是不一样的)。

在此处,也引入一些关于接口设计、抽象类设计相关的:在开发中我们经常需要定义一个接口(前文提到的html抽取,就可以定义一个html抽取的接口),然后我们往往需要定义一个骨架类(Effect java有一条关于接口的设计是这样描述的,在java的底层代码中就可以看到这样的例子:List---AbstractList---ArrayList,这个骨架类,有时候我们就可以像本文中介绍的定义成一个模板抽象类了(这要视情况而定)

设计原则

以下仅是简短的介绍

单一职责原则:简单讲,一个类应该只有原因引起其变更(方法的设计也要尽量满足,最简单也是比较容易违反的一个原则,在下面关于开发中分层的讨论会提及)

接口隔离原则:接口要尽可能小。

迪米特法则:我的知识你知道的越少越好(在门面模式和中介者模式中能体现出来)

开闭原则:应使设计做到对扩展开放、对扩展关闭(这个往往是比较难做到的,开闭原则用一种简单的方式介绍就是:一个类应该对内部的代码修改是关闭的。)

依赖倒置原则:这个不用多说,在spring框架中表现的淋漓尽致

里式替换原则:这个其实我看不太懂,但是本文介绍的模板方法模式是违背了这个原则的。

何为分层

web开发中,总是强调一个分层。dao,service,action,view各种,但是有时候也容易出现分层不明确的情况,也就是各层的职责不清晰(也就是前文说的,违反单一职责原则)。有时候会出现action层中嵌入太多底层service代码的情形,更有甚者,在view层写一大堆控制。因此,笔者认为的分层,就应该是职责清晰的分层。而不是简简单单一味地把web开发就划分成dao,service,action,view,在一些情况下,是不适用于分层和oo理论的(你总不能写个简单的1加到100的程序都要分层和oo吧)。

后记

发现一篇文章介绍完面向对象设计肯定是远远不够的,这篇文章,太短了会显得介绍不清楚,太长了又影响观阅性。因此,这里就先结束这方面的讨论了,后面还是会补。(设计这种东西,即使写一本书,也不一定能介绍的完,更希望此文起到一种抛砖引玉的结果。)

 


转载于:https://my.oschina.net/u/1427420/blog/335132

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值