连载:面向对象的葵花宝典:思考、技巧与实践(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面向对象六大原则和设计模式
面向对象六大原则 在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活.清晰,只是为你优秀的代码之路铺上了一层栅栏,在这些原则的指导下,你才能避免陷入一些常见的代码泥沼,从而让你写 ...
随机推荐
- Objective-C类的使用
Objective-C教程的例题: // // main.m // test // // Created by liwei on 14-10-28. // Copyright (c) 2014年 li ...
- CodeForces 52C Circular RMQ(间隔周期段树,间隔更新,间隔总和)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are g ...
- 手势(Gesture)的增加和识别
Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势.Android使用GestureLibrary代表手势库,提供Gestur ...
- MySQL与Oracle的语法区别详细对比 (转)
Oracle和mysql的一些简单命令对比 1) SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_c ...
- [Ext.Net]GridPanel之Access数据库分页显示
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- 9种CSS3 blend模式制作的鼠标滑过图片标题特效
这是一款使用CSS3 background-blend-mode制作的鼠标滑过图片标题特效.该图片标题特效在鼠标滑过一张图片的时候,图片的标题会对应的动画,而且图片会使用css blend模式渲染为很 ...
- 同TextView在不同的显示内容
首先,请原谅我不能命名文章.. . 我们不能准确地表达你说说什么什么,真正急着赶智商. 直接在地图上 如图所看到的显示的是两个textview 第一个实现的是,在同一个textview中给不同内容赋予 ...
- dlmalloc 2.8.6 源代码具体解释(6)
本文章由vector03原创, 转载请注明出处. 邮箱地址: mmzsmm@163.com, 欢迎来信讨论. 3.4 sys_alloc sys_alloc是dlmalloc中向系统获取内存的主要接口 ...