连载:面向对象葵花宝典:思想、技巧与实践(39) - 设计原则 vs 设计模式

又是设计原则,又是设计模式,到底该用哪个呢? =============================================================================

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

举一个很简单的例子:假设我们要设计一个图形类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 设计模式

时间: 2024-08-26 00:50:57

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

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

前面具体阐述了"高内聚低耦合"的整体设计原则.但怎样让设计满足这个原则,并非一件简单的事情.幸好各位前辈和大牛已经帮我们归纳总结出来了,这就是"设计原则"和"设计模式".毫不夸张的说,仅仅要你吃透这些原则和模式并熟练应用,就能够做出非常好的设计. ================================================================== [SRP原则具体解释] SRP.single responsibil

《面向对象葵花宝典》阅读笔记

满满的干货!推荐大家购买的一本书,里面很多的内容,都是我编程过程经历过的困惑(相信大家都会遇到),如果早点看到这本书,相信当时我也不会困惑那么久了~所以记录总结一下. PS.欲看此书,不必自宫…… 面向对象理论面向过程与面向对象为什么要面向对象类对象接口抽象类抽象封装继承多态需求模型需求分析518方法,我要发~用例方法要画UML图吗?功能提取领域模型设计模型类模型动态模型实现模型设计原则内聚耦合高内聚低耦合设计模式面向对象架构设计业务架构领域架构软件建构面向对象架构设计技巧原则拆与合 面向对象理

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(OOP)(转发)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程的软件设计原则

在開始Android软件实际APP開始之前,我们须要对面向对象设计原则及设计模式做一个初步的了解.才干在以后的实战过程中,少走弯路.使我们的软件开发生涯感觉到快乐.轻松.好了,废话少说,咱们今天给大家一起探讨一下软OOP中的软件开发设计原则.这些东东都是OOP的设计精髓,他们蕴藏着前辈留下的产物.眼下.软件设计最基本原则有下面几种(总共同拥有11种):单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则和里氏替换(Liskov替换)原则 单一职责原则 就是一个类值做一件事情.引起它发生变化的仅

喵星之旅-沉睡的猫咪-面向对象的设计原则

一.设计原则是什么? 有句话叫“人民群众是历史的创造者”,他的意思我理解为任何的理论都是基于具体的客观展现总结出来的,没有人民创造的既定事实,就无法出现任何的有理有据的理论模型. 对于面向对象的软件设计,最著名的一本书就应该是当年gof的那一本<设计模式:可复用面向对象软件的基础>.设计模式是面对具体问题,进行抽象分类,然后总结出来的行之有效的解决方案,就像人去创造历史.设计原则是进一步研究这些解决方案,进一步抽象出的指导思想. 如果把设计模式比喻成传统数学,即“1+1=2”的那套理论,那么设

7大面向对象设计原则

面向对象设计原则 一.概述 针对软件的可维护性和可复用性,知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成:过于僵硬(Rigidity) ,过于脆弱(Fragility) ,复用率低(Immobility) ,黏度过高(Viscosity) .软件工程和建模大师Peter Coad认为,一个好的系统设计应该具备如下三个性质:可扩展性(Extensibility) ,灵活性(Flexibility),可插入性(P

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

软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成:? 过于僵硬(Rigidity) ? 过于脆弱(Fragility) ? 复用率低(Immobility) ? 黏度过高(Viscosity) 软件工程和建模大师Peter Coad认为,一个好的系统设计应该具备如下三个性质:? 可扩展性(Extensibility) ? 灵活性(Flexibility)? 可插入性(Pluggabil