连载:面向对象的葵花宝典:思考、技巧与实践(39) - 设计原则 vs 设计模式
它的设计原则,和设计模式,是否该用它? =============================================================================
在“设计模型”一章中。我们提到设计原则和设计模式是互补的,设计原则和设计模式互补体如今:设计原则主要用于指导“类的定义”的设计,而设计模式主要用于指导“类的行为”的设计。
举一个非常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 设计模式的更多相关文章
- 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...
- 连载:面向对象葵花宝典:思想、技巧与实践(30) - SRP原则
前面具体阐述了"高内聚低耦合"的整体设计原则.但怎样让设计满足这个原则,并非一件简单的事情.幸好各位前辈和大牛已经帮我们归纳总结出来了,这就是"设计原则"和&q ...
- 【OOAD】面向对象设计原则概述
软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity) ...
- 连载:面向对象葵花宝典:思想、技巧与实践(34) - DIP原则
DIP,dependency inversion principle,中文翻译为"依赖倒置原则". DIP是大名鼎鼎的Martin大师提出来的.他在1996 5月的C++ Repo ...
- 连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则
LSP是唯一一个以人名命名的设计原则,并且作者还是一个"女博士" ======================================================== ...
- 连载:面向对象葵花宝典:思想、技巧与实践(35) - NOP原则
NOP.No Overdesign Priciple.不要过度设计原则. 这应该是你第一次看到这个原则.而且你也不用上网查了,由于这个不是大师们创造的,而是我创造的:) 之所以提出这个原则,是我自己吃 ...
- 翻译 | The Principles of OOD 面向对象设计原则
本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...
- OOAD之面向对象设计原则
学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则 (一)如何衡量软件设计的质 ...
- Java基础学习总结(84)——Java面向对象六大原则和设计模式
面向对象六大原则 在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活.清晰,只是为你优秀的代码之路铺上了一层栅栏,在这些原则的指导下,你才能避免陷入一些常见的代码泥沼,从而让你写 ...
随机推荐
- 使用JavaMail发送和接收电子邮件
一. 为什么要学习JavaMail 为什么要学习JavaMail开发? 如今非常多WEB应用在开发时都须要集成邮件发送功能.比如: 1. 给新注冊的用户自己主动发送一封包括其注冊信息的欢迎E-Mail ...
- SharePoint Server 2010 删除Web应用
SharePoint Server 2010 删除Web应用 因为之前的测试.在SharePointserver创建于非常多Web应用(我是在本机Win7系统上安装的SharePoin ...
- VirtualBox安装ubuntu14.04和文件共享
因为机器的VMware使用很卡,占用更多的内存,所以我想,以取代VirtualBox.已安装ubuntu14.04使用与VMware在相同的. VirtualBox下载链接:https://www.v ...
- crm采用soap删除记录
//抽样 function demo() { //操作记录id var targetId = "A8A46444-BA10-E411-8A04-00155D002F02&qu ...
- 【buildroot-2011.11】You may have to install 'g++' on your build machine
buildroot - 2011.11 当进行交叉编译.例如像以下错误提及演示: "You may have to install 'g++' on your build machine&q ...
- 1008: University
&method=showdetail&id=1008" style="background-color:rgb(255,0,0)">台州ACM:10 ...
- 【安卓笔记】高速的发展设置界面-----PreferenceActivity
通常app都会有一个设置界面,例如以下: 通常做法是自定义布局,然后在代码里面加入响应函数,并将结果保存到Sharedpreferences中. android给我们提供了PreferenceActi ...
- 关于js中window.location.href,location.href,parent.location.href,top.location.href的使用方法
关于js中"window.location.href"."location.href"."parent.location.href".&qu ...
- quick 2.23 它们的定义c++代码lua与总结的一些细节
它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...
- base 64 编解码器
base 64 编解码 1. base64的编码都是按字符串长度,以每3个8bit的字符为一组, 2. 然后针对每组.首先获取每一个字符的ASCII编码. 3. 然后将ASCII编码转换成8bit的二 ...