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

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

举一个非常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. python学习笔记之三:字典,当索引不好用时

    字典是python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里.键可以是数字,字符串甚至是元组. 1. 创建和使用字典 字典可以通过下面的方式创建: phon ...

  2. 项目架构mvc+webapi

    mvc+webapi 项目架构 首先项目是mvc5+webapi2.0+orm-dapper+ef codefirst. 1.项目框架层次结构: 这个mvc项目根据不同的业务和功能进行不同的区域划分, ...

  3. accept功能

    accept()功能 系统调用 accept() 这将是一个有点陌生的地方! 你可以想象发生 这种事情:这是非常远离你通过倾听 (listen()) 的port连接 (connect()) 你的机器. ...

  4. Linux shell用法和技巧(转)

    使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并 ...

  5. trie + 长度优先匹配,生成串

    import com.google.common.collect.Maps; import java.util.Map; /** * tree 节点 * Created by shuly on 16- ...

  6. REST API 基于ACCESS TOKEN

    REST API 基于ACCESS TOKEN 的权限解决方案   REST 设计原则是statelessness的,而且但客户端是APP时,从APP发起的请求,不是基于bowers,无法带相同的se ...

  7. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称

    转载请注明出处:http://blog.csdn.net/u012860063 问题:设单链表中存放n个字符.试设计一个算法,使用栈推断该字符串是否中心对称,如xyzzyx即为中心对称字符串. 代码例 ...

  8. poj 1962 Corporative Network

    主题链接:http://poj.org/problem?id=1962 思路:每一个集合中用根节点标记这个集合,每一个点到根节点的距离. code: <span style="font ...

  9. Sonar安装与使用说明

    我总结的Sonar安装与使用说明,需要的可以去网盘下载. 网盘地址: http://pan.baidu.com/s/199BII

  10. 直接插入排序---java实现

    思路:遍历无序的原数组,把第i个的后一个即i+1去与前面的i个逐个比较... 解法一: package com.sheepmu.text; import java.util.Arrays; /* * ...