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

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

举一个非常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. 足球和oracle系列(3):oracle过程排名,世界杯第二回合战罢到来!

    足球与oracle系列(3):oracle进程排名.世界杯次回合即将战罢! 声明:        这不是技术文档,既然学来几招oracle简单招式.就忍不了在人前卖弄几下.纯为茶余饭后与数朋库友的插科 ...

  2. IntelliJ IDEA常见问题解决办法汇总

    (1)SVN相关的操作: 启用:方法1:VCS菜单下Enable Version Control Integration,点击之后选择相应的版本控制工具方法2:Setting中Version Cont ...

  3. 求pi 的公式

    pi = 3.1415926..... 下面用c 语言来求解PI 现有公式 (pi*pi)/6 = 1 + 1/(2*2) + 1/(3*3) + ... + 1/(n*n); #include &l ...

  4. 数据结构 - trie

    #include <cstring> #include <iostream> #include <map> #include <cstdio> usin ...

  5. cocos2d之Box2D详细说明 鼠标联合实现

    cocos2d之Box2D具体解释 鼠标关节实现 DionysosLai2014-5-7 我们常常要移动物理世界中的某个物体,例如说石头.木块等.假设我们直接改变这些物体的位置,让这些物体尾随我们手指 ...

  6. OWIN编写中间件

    OWIN系列之自己动手编写中间件 一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. ...

  7. SorlNet

    Solr学习 上一篇已经讲到了Solr 查询的相关的参数.这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多, ...

  8. CareerCup Chapter 4 Trees and Graphs

    struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...

  9. ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法

    主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 ...

  10. [LeetCode290]Word Pattern

    题目: Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...