OO与设计模式的原则、目标(转)

前两天,和一朋友聊到OO设计原则时,对设计模式有了更深的了解,在这里总结一下,与大家分享。
OO(Object–Oriented )面向对象 
  OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。

OO的设计目标:

  • 可扩展性:有了新的需求,新的性能可以容易添加到系统中,不影响现有的性能,也不会带来新的缺陷。
  • 可修改性:系统一部分的代码要修改时不会破坏系统的现有结构,也不会影响到其它的部分。
  • 可替换性:可以将系统中的某些代码替换为相同接口的其它类,不会影响到系统。

设计模式的设计原则:

  • “开放--封闭”原则:
    设计模式的核心原则。软件实体(类,模块,函数)对于扩展是开放的,对于修改是关闭的 。实现开闭原则的关键就是抽象化。“开放--封闭”原则中,不允许修改的是抽象的类或者接口。允许扩展的是具体的实现类,抽象类和接口在“开-闭”原则中扮演着极其重要的角色 。
  • 封装变化点原则:
    这是对"开-闭"原则最好的实现..不要把你的可变因素放在多个类中,或者散落在程序的各个角落..你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起..最好的解决办法是,分块封套你的可变因素!!避免超大类,超长类,超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!!
  • 里氏代换原则:
    任何基类可以出现的地方,子类也可以出现 。
  • 依赖倒转原则:
    要依赖抽象,而不要依赖具体的实现。抽象不应当依赖于细节,细节应当依赖于抽象;要针对接口编程,不要针对实现编程
  • 单一职责原则:
    一个类应该只有一个引起它变化的原因。
  • 接口隔离法则 :
    为了做到尽可能小的耦合性,我们需要使用接口来规范类,用接口来约束类。要达到迪米特法则的要求,最好就是实现接口隔离法则。使用多个专门的接口比使用单一的总接口要好.从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。一个接口应当简单地代表一个角色,而不是多个角色。多个演员可以同时演一个角色,就象孙悟空的孩儿一样。
  • 合成/聚合原则:
    要尽量使用合成/聚合原则,而不是继承关系达到软件复用的目的。聚合用来表示“拥有”或整体与部分的关系,而合成则用来表示一种强得多的“拥有”关系。在一个合成关系里,部分和整体的生命周期是一样的。合成就象所说的“合成品”,拆开就坏。
  • 迪米特法则:
    系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度。 一个对象应当对其它对象有尽可能少的了解,两个类不必直接通信,可以通过第三者(抽象)转发这个调用,这个抽象的第三者可以是门面,可以是调停者,甚至是一个抽象类或接口,模块要独立,独立被封装,他们只靠public的API来通信,只要有可能,一个类应当设计成不变类,其属性都应该是私有的,如果一个类有太多的public访问权限的方法,可以考虑使用多个类把一个类的私有方法和公有方法分开。

聚合(Aggregation):

这是一种松散的对象间的关系.举个例子:计算机和他的外围设备就是一例.

用来表示拥有关系或者整体与部分的关系。

组合(Composition):

这是一种非常强的对象间的关系,举个例子,树和它的树叶之间的关系.

在一个合成里,部分与整体的生命周期都是一样的。一个合成的新对象完全拥有对其组成

部分的支配权。包括他们的创建和毁灭。

最后总结一下:

聚合:

  • 聚合有时能够不依赖部分而存在,有时又不能
  • 部分可以独立于聚合而存在
  • 如果有一部分遗失,聚合会给人一种不完全的感觉
  • 部分的所有权可以由几个聚合来共享,比如打印机

合成:

  • 部分某一时刻只能属于某一个组成
  • 组成唯一的负责处理它的所有部分--这就意味着负责他们的创建与销毁
  • 倘若对于部分的职责由其他对象来承担的话,组成也就可以放松这些职责。
  • 如果组成销毁的话,它必须销毁所有的部分,或者把负责他们的权利转移给其他对象。

设计模式所解决的问题:
通过显示指定类创建对象:
     相关的设计模式:简单工厂、工厂方法、抽象工厂。
紧耦合:
    相关的设计模式:抽象工厂、命令模式、外观模式、中介者模式、观察者模式、职责链模式等。
对对象表示或实现的依赖:
     相关的设计模式:抽象工厂、桥接模式、备忘录模式、代理模式等。
通过生成子类扩展功能:
     相关的设计模式:桥接模式、职责链模式、组合模式、装饰模式、观察者模式、策略模式等。
有能方便地修改类:
     相关的设计模式:适配器模式、装饰模式、访问者模式等。
对算法的依赖:
     相关设计模式: 生成器模式、迭代模式、策略模式、模板方法模式、访问者模式等。
对软硬件环境的依赖:
     相关设计模式:抽象工厂模式、桥接模式等。

参考:http://ankye1234.blog.163.com/blog/static/964828920075444512292/

OO与设计模式的原则、目标的更多相关文章

  1. Java 设计模式六原则及23中常用设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  2. 图解Java设计模式之设计模式七大原则

    图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...

  3. 设计模式六大原则——合成/聚合复用原则(CARP)

    1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...

  4. GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则

    20151218mark 延伸扩展: -设计模式在很多语言PHP.JAVA.C#.C++.JS等都有各自的使用,但原理是相同的,比如JS常用的Javascript设计模式 -详解设计模式六大原则 设计 ...

  5. PHP 设计模式六大原则

    http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...

  6. ZT 设计模式六大原则(1):单一职责原则

    zt 设计模式六大原则(1):单一职责原则 分类: 设计模式 2012-02-21 09:52 25059人阅读 评论(65) 收藏 举报 设计模式stringclass编程 (THERE SHOUL ...

  7. ZT 设计模式六大原则(2):里氏替换原则

    设计模式六大原则(2):里氏替换原则 分类: 设计模式 2012-02-22 08:46 23330人阅读 评论(41) 收藏 举报 设计模式class扩展string编程2010 肯定有不少人跟我刚 ...

  8. zt 设计模式六大原则(3):依赖倒置原则

    下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...

  9. ZT 设计模式六大原则(6):开闭原则

    ZT 设计模式六大原则(6):开闭原则 分类: 设计模式 2012-02-27 08:48 24870人阅读 评论(72) 收藏 举报 设计模式扩展框架编程测试 定义:一个软件实体如类.模块和函数应该 ...

随机推荐

  1. flume-ng 集群搭脚本

    #!/bin/bash # author: xirong # date : -- ##### 搭建 flume 集群的脚本 # 注意: # . 需要 jdk7 环境,如果没有 Java 环境,请配置 ...

  2. Beego框架使用

    go get github.com/astaxie/beego vim hello.go package main import "github.com/astaxie/beego" ...

  3. Linux环境下使用perl编写CGI(httpd)

    例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...

  4. golang channel buffer

    package mainimport ( "fmt" "time")func main() { // Case-1: no buffer //chanMessa ...

  5. hdu 5289 rmp+二分+枚举后界 or单调队列 ****

    好题~~ 给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数,枚举后界~~ 又是一种没见过的方法,太弱了/(ㄒoㄒ)/~~ #include <cstdio ...

  6. PMP 第八章 项目质量管理

    1规划质量 2实施质量保证 3实施质量控制 质量成本 1.等级和质量的区别?现代质量管理的重要性,关注图8-2    质量是一些列内在特性满足要求的程度,而等级是对用途相同但技术特性不同的产品或服务的 ...

  7. php获取当前毫秒时间戳

    最近在做一个智能家居项目的后台,需要实时上传用户对智能设备的配置信息到服务器,以便实现同步,因此对于时间的精确度要求比较高,最开始直接是用php的time()函数来获取时间戳,获取的时间精确到秒级别, ...

  8. Hbuilder连接模拟器调试

    Hbuilder是一个非常好用的HTML5开发IDE,我最喜欢的功能就是连接手机调试了,连接手机调试有两种途径,一是通过USB连接真机,二是下载安装一个安卓模拟器,让Hbuilder连接到安卓模拟器, ...

  9. VS2010和matlab2010混合编程中char16_t重定义的问题

    原因是VS2010中的yvals.h添加了char16_t的定义,而Matlab的matrix.h也包含对char16_t的定义,所以同时包含这两个头文件的话,会导致重复定义char16_t的错误.只 ...

  10. Zigzag

    date: 2015-09-24 21:09:00 Print Zigzag 思路: 1 首先是按行输出,每行输出相同位置的下一间隔为row*2-2,行游标0 初始化时(每一行的首个斜向部分),j=i ...