欢迎来到天天文库
浏览记录
ID:30776115
大小:183.92 KB
页数:13页
时间:2019-01-03
《java设计模式教程——策略模式-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java设计模式教程——策略模式木文由ImportNew-hejiani翻译自javaworld0欢迎加入翻译小组。转载请见文末要求。1984年,我以机械工程学位从大学毕业,开始了软件工程师的职业生涯。自学C语言Z后,1985年从事了用于Unix的50,000行用户图形界面(GUI)开发。整个过程非常轻松愉快。1985年底,我的编码工作完成了,Z后我考虑开始其他的项目一一或者说我认为我可以进行新的项目了。但很快我收到了一系列bug报告和新增的需求,为修正错误我开始努力阅读这50,000行代码。这个工作却非常艰难。
2、整个程序就像真止用卡片做成的房了一样,几乎每天都会轰然倒卞。即使是最微小的变化我也要花费几个小时来恢复程序的稳定性。可能我碰巧发现了一个重要的软件工程原则:开发阶段轻松愉快,然后项目部署后就去找下一份工作。然而,实际上我的怵I难源于我对面向对象(object-oriented,00)软件开发基本原则蚩俵的无知。我的程序就是个大型的switch语句集合,在不同情况下调用不同的函数一一这导致了代码的紧耦合以及整个软件难以适应变化。在Java设计模式这篇文章,我会讨论策略模式,它可能是最基础的设计模式吧。如果在1984
3、年的吋候我知道策略模式的话,有很大一部分工作就可以避免了。策略模式在G0F的设计模式一书的第一章,作者讨论了若干条00设计原则,这些原则包描了很多设计模式的核心。策略模式体现了这样两个原则——封装变化琳对接口编程而不是对实现编程。设计模式的作者把策略模式定义如下:Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeablc.[The]Strategy[pattcrn]letsthealgorithmvaryindependently
4、fromclientsthatuseit.(策略模式定义了一系列的算法,并将每一个算法封装起來,而且使它们还可以相互替换。策略模式让算法独立丁使用它的客户而变化。)策略模式将整个软件构建为可互换部分的松耦合的集合,而不是单一的紧耦合系统。松耦合的软件可扩展性更好,更易于维护且重用性好。为理解策略模式,我们首先看一下Swing如何使用策略模式绘制组件周围的边框。接着讨论Swing使用策略模式带来的好处,最后说明在你的软件中如何实现策略模式。Swing边框几乎所有的Swing组件都可以绘制边框,包括面板、按钮、列表等
5、等。Swing也捉供了组件的多种边框类型:bevel(斜而边框),etched(浮雕化边框),line(线边框),titled(标题边框)以及compound(复合边框)等。Swing组件的边框使用JComponent类绘制,它是所有Swing组件的基类,实现了所有Swing组件的常用功能。JComponent实现了paintBordcr(),该方法用來绘制组件周围的边框。假如Swing的创建者使用类似示例1的方法实现paintBorder()://AhypotheticalJComponent.paintBor
6、dermethodprotectedvoidpaintBorder(Graphicsg){switch(getBorderType()){caseLINEBORDER:paintLineBorder(g);break;caseETCHEDBORDER:paintEtchedBorder(g);break;caseTITLEDBORDER:paintTitlcdBorder(g);break;•••}}示例1绘制Swing边框的错i吴方式示例1屮JComponent.paintBorder()方法在JCompone
7、nt硬编码了边框的绘制。如果你想实现一种新的边框类型,可以想见这样的结果一一需要修改JComponent类的至少三个地方:首先,添加与新边框类型相关的新的整数值。第二,switch语句中添加case语句。第三,实现paintXXXBorder()方法,XXX表示边框类型。很显然,扩展前而的paintBorder()吃力不讨好。你会发现不仅paintBorder()很难扩展新类型,而RJComponent类不是你首先要修改的位置,它是SwingX具包的一部分,这意味着你将不得不重新编译类和重建全部工具包。你也必须要
8、求你的用户使用你自己的Swing版本而不是标准版,Swing下一次发布后这些工作依然要做。此外,因为你为JComponent类添加了新的边框绘制功能,无论你是否喜欢每个Swing组件都可以访问该功能的现状一一你不能把你的新边框限制到具体的组件类型。可见,如果JComponent类使用示例1中的switch语句实现其功能,Swing组件就不能被扩展。那么运用00思想如何实现
此文档下载收益归作者所有