它的设计原则,和设计模式,是否该用它? =============================================================================

在“设计模型”一章中。我们提到设计原则和设计模式是互补的,设计原则和设计模式互补体如今:设计原则主要用于指导“类的定义”的设计,而设计模式主要用于指导“类的行为”的设计。

举一个非常easy的样例:如果我们要设计一个图形类Shape。这个类既支持三角形。又支持矩形,其代码例如以下:

package com.oo.designpattern.diagram;

/**
* 设计不好的Shape类,同一时候兼顾三角形和矩形的职责,不符合SRP设计原则
*
*/
public class BadShape { //三角形的属性
Position a;
Position b;
Position c; //矩形的属性
Position m;
int length;
int width; public void drawTriangle(){
//TODO: 画出三角形
} public void drawRectangle(){
//TODO: 画出矩形
}
}

有经验的朋友都会认为这个设计不太合理。由于其不符合类的SRP设计原则。因此,合理的做法是将这个类依照SRP原则拆分,详细拆分方法例如以下:

NormalShape.java

package com.oo.designpattern.diagram;

/**
* 将BadShape拆开为三角形和矩形两个图形,并提取出NormalShape这个父类
*
*/
abstract class NormalShape {
abstract void draw();
}

NormalTriangle.java

package com.oo.designpattern.diagram;

/**
* 三角形类
*
*/
public class NormalTriangle extends NormalShape { //三角形的属性
Position a;
Position b;
Position c; @Override
public void draw() {
// TODO:绘画三角形
if(Config.CURRENT_SYSTEM == Config.WINDOWS){
//TODO: 调用Windows的绘图方法
}
else if( Config.CURRENT_SYSTEM == Config.LINUX){
//TODO: 调用Linux的绘图方法
}
else if( Config.CURRENT_SYSTEM == Config.MAC){
//TODO: 调用Mac的绘图方法
}
} }

NormalRectangle.java

package com.oo.designpattern.diagram;

/**
* 矩形类
*
*/
public class NormalRectangle extends NormalShape { //矩形的属性
Position m;
int length;
int width; @Override
public void draw() {
// TODO: 绘画矩形
if(Config.CURRENT_SYSTEM == Config.WINDOWS){
//TODO: 调用Windows的绘图方法
}
else if( Config.CURRENT_SYSTEM == Config.LINUX){
//TODO: 调用Linux的绘图方法
}
else if( Config.CURRENT_SYSTEM == Config.MAC){
//TODO: 调用Mac的绘图方法
}
} }

这样拆分之后,从类的设计原则来看。已经是符合要求了。

接下来我们再使用设计模式来继续完好这个设计,这里就须要使用设计模式之道来指导我们设计了。即:找到变化,封装变化

关于图形类一个比較明显的变化是跨平台,比方说要同一时候支持Windows、Linux、Mac三个桌面操作系统,那么实际绘图的方法和须要调用的函数可能就随着平台的不同而变化,因此我们要找出一种方法来封装这样的变化。

參考《设计模式》,能够知道这样的方法就是“Bridge模式”,使用了Bridge后,会多出几个接口和实现类。

详细实现例如以下:

GoodShape.java

package com.oo.designpattern.diagram;

/**
* 在NormalShape的基础上。添加Bridge设计模式的实现。使其更加适应于跨平台
*
*/
abstract public class GoodShape { protected ShapeDraw _draw; //将不同平台的实现封装到一个新的接口ShapeDraw
abstract void draw();
}

GoodTriangle.java

package com.oo.designpattern.diagram;

/**
* 依照Bridge设计模式设计的三角形类
*
*/
public class GoodTriangle extends GoodShape { GoodTriangle(ShapeDraw draw){
this._draw = draw;
} @Override
void draw() {
// TODO Auto-generated method stub
this._draw.drawTriangle();
} }

GoodRectangle.java

package com.oo.designpattern.diagram;

/**
* 依照Bridge设计模式设计的矩形类
*
*/
public class GoodRectangle extends GoodShape { GoodRectangle(ShapeDraw draw){
this._draw = draw;
} @Override
void draw() {
// TODO Auto-generated method stub
this._draw.drawRectangle();
} }

ShapeDraw.java

package com.oo.designpattern.diagram;

/**
* 依照Bridge设计模式进行设计的绘图的接口。封装了跨平台不同的实现
*
*/
interface ShapeDraw { public void drawTriangle();
public void drawRectangle();
}

WindowsDraw.java

package com.oo.designpattern.diagram;

/**
* Windwos上的绘图实现
*
*/
public class WindowsDraw implements ShapeDraw { @Override
public void drawTriangle() {
// TODO Auto-generated method stub } @Override
public void drawRectangle() {
// TODO Auto-generated method stub } }

LinuxDraw.java

package com.oo.designpattern.diagram;

/**
* Linux上的绘图实现
*
*/
public class LinuxDraw implements ShapeDraw { @Override
public void drawTriangle() {
// TODO Auto-generated method stub } @Override
public void drawRectangle() {
// TODO Auto-generated method stub } }

MacDraw.java

package com.oo.designpattern.diagram;

/**
* Mac上的绘图实现
*
*/
public class MacDraw implements ShapeDraw { @Override
public void drawTriangle() {
// TODO Auto-generated method stub } @Override
public void drawRectangle() {
// TODO Auto-generated method stub } }

能够看到,依照设计原则和设计模式进行重构后,原来不合理的设计逐步演变为一个优秀的设计了

================================================ 
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/38655873
================================================

版权声明:本文博主原创文章。博客,未经同意不得转载。

连载:面向对象的葵花宝典:思考、技巧与实践(39) - 设计原则 vs 设计模式的更多相关文章

  1. 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

    面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...

  2. 连载:面向对象葵花宝典:思想、技巧与实践(30) - SRP原则

    前面具体阐述了"高内聚低耦合"的整体设计原则.但怎样让设计满足这个原则,并非一件简单的事情.幸好各位前辈和大牛已经帮我们归纳总结出来了,这就是"设计原则"和&q ...

  3. 【OOAD】面向对象设计原则概述

    软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity)  ...

  4. 连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则

    DIP,dependency inversion principle,中文翻译为"依赖倒置原则". DIP是大名鼎鼎的Martin大师提出来的.他在1996 5月的C++ Repo ...

  5. 连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则

    LSP是唯一一个以人名命名的设计原则,并且作者还是一个"女博士"  ======================================================== ...

  6. 连载:面向对象葵花宝典:思想、技巧与实践(35) - NOP原则

    NOP.No Overdesign Priciple.不要过度设计原则. 这应该是你第一次看到这个原则.而且你也不用上网查了,由于这个不是大师们创造的,而是我创造的:) 之所以提出这个原则,是我自己吃 ...

  7. 翻译 | The Principles of OOD 面向对象设计原则

    本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...

  8. OOAD之面向对象设计原则

    学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则  (一)如何衡量软件设计的质 ...

  9. Java基础学习总结(84)——Java面向对象六大原则和设计模式

    面向对象六大原则 在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活.清晰,只是为你优秀的代码之路铺上了一层栅栏,在这些原则的指导下,你才能避免陷入一些常见的代码泥沼,从而让你写 ...

随机推荐

  1. USACO sprime

    /* ID:kevin_s1 PROG:sprime LANG:C++ */ //N = 1仅仅可能为2,3,5,7.N > 1仅仅可能为1,3,7.9. N = i,到N = i + 1递推假 ...

  2. 【设计优化】-使用缓冲(Buffer)提高程序性能

    缓冲区是一块特定的内存区域.开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异,提高系统性能. 缓冲能够协调上层组件和下层组件的性能差异.当上层组件性能因为下层组件时,能够有效地降低上层组件对下层 ...

  3. 添加xml文件编辑语法提示

    找到Struts的lib目录 找到struts2-core-文件并解压开 这个struts.dtd文件才是我们需要添加的文件 双击XML Catalog 点击ADD Key中复制粘贴D:\web\st ...

  4. 【SICP归纳】2 高阶函数和数据抽象

    上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说 ...

  5. Windows 8 应用开发 - 磁贴

    原文:Windows 8 应用开发 - 磁贴      我们开发的应用在Win8 界面中会以磁贴形式展现,默认情况下磁贴会显示应用图标,即项目工程中的Logo.png图片文件.开发人员可按应用的需要使 ...

  6. 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口

    原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 [源码下载] 重新想象 Windows 8 Store Apps (27) - ...

  7. improper Advertising identifier [IDFA] Usage. Your app contains the Advertising Identifier [IDFA] AP

    找到答案了.随便传个包上去.然后拒绝掉,又一次prepare to upload.就会出现选项. 相应选择就好了.

  8. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}

    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to'org.eclipse ...

  9. 使用 WPF 创建单实例应用程序

    一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口 ...

  10. String类疑虑

    Java String类疑虑: 创 拼接 String是java的经常使用类之中的一个,本质是字符数组char[].String类是final类,不可被继承. 关于String的创建,能够通过new来 ...