第一章 引言

本章主要是让我们大致明白设计模式是干嘛用的,模式分类,设计模式如何解决设计问题以及几种常见的面向对象设计中软件的复用方法。

1.什么是设计模式?

个人理解概括,设计模式是对一类问题的抽象,并描述了该类问题的解决方案。是对用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。

模式四要素:(1)模式名称 。设计模式使得我们能在高的抽象层次上进行设计;(2)问题 。何时使用该模式;(3)解决方案 。对应与设计问题的解决方法,设计的组成成分,之间的相互关系以及各自的职责和协作方式。(4)效果。模式应用的效果以及使用该模式时候应该权衡的问题。

举例:MVC设计模式

MVC,模型/视图/控制器(model/view/controller),被用来构建用户界面。 model是应用对象,view是模型在屏幕上的显示,controller是定义用户界面对用户输入的响应方式。

2.模式分类

(1)创建型模式(creational):

与对象的创建有关。创建型类模式将对象的部分创建工作延迟到子类;创建性对象模式将对象的部分创建延迟到另一个对象。

(2)结构型模式(structual):

处理类或者对象的组合。结构性类模式使用继承组合类;结构性对象模式使用组合对象。

(3)行为型模式(behavioral):

描述类或者对象如何交互,如何分配职责。行为型类模式使用继承描述算法和控制流;行为型对象模式描述一组对象如何协作来完成单个对象不能完成的工作。

3.设计模式如何解决问题

(1)寻找适合的对象

(2)决定对象的粒度

(3)指定对象的接口

(4)描述对象的实现

(5)运用复用机制

    A.继承

优势:白箱复用。父类的实现细节对子类可见,子类可重定义或者覆盖父类的操作。

缺点:破坏了父类的封装性;父类实现的变化会对子类有很大影响,子类严重依赖于父类。

一个解决方法是,只继承抽象类。

    B.组合

优势:黑箱复用。系的功能通过对象的组装或者组合实现,类的实现不可见;对象只通过接口访问,不破坏封装性。

             组合对象通过获得对其他对象的引用而在运行时刻动态地定义。保证每个类被封装,并集中在单任务上。系统的行为将依赖对象间的关系,而不是集中在一个类中。

             面向对象设计原则:优先使用对象组合,而不是类继承。

委托是一种组合的特例。它使得组合具有与继承同样的复用功能。委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给代理者。

   C.模板(参数化类型)

定义一个类型时候,不用指定所用到的其他类型。

  

聚合VS关联或者引用:


当类之间有整体-部分关系的时候,我们就可以使用聚合。


关联或者引用是比聚合更弱的一种耦合关系。C3->C4:表示相识关系,指C3知道C4,C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。


耦合强弱关系: 依赖(对象作为操作的参数)<关联(成员是指针)<聚合(成员是对象)<组合(成员是对象) 


4.设计模式应该支持变化

设计模式在应用程序、工具箱、框架中所起的作用。

(1)应用程序

(2)工具箱

(3)框架

UML中类之间的关系图,可以参考这篇文章:点击打开链接 http://www.cnblogs.com/riky/archive/2007/04/07/704298.html

第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma的更多相关文章

  1. 《设计模式:可复用面向对象软件的基础》【PDF】下载

    <设计模式:可复用面向对象软件的基础>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382288 内容介绍 <设计模式:可复 ...

  2. 设计模式(Design Patterns——可复用面向对象软件的基础

        设 计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问 ...

  3. Java设计模式(Design Patterns)——可复用面向对象软件的基础

    设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了可重用代码.让代码更容易被他 ...

  4. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  5. Eclipse之父、《设计模式》作者、Junit作者之Erich Gamma

    Erich Gamma拥有多重权威身份.他是Jazz项目的主要领导人:是Eclipse的项目管理委员会成员,被业界称为“Eclipse之父”: 是经典书<设计模式>的作者四人帮之一,199 ...

  6. C# Language Specification 5.0 (翻译)第一章 引言

    C#(念作 See Sharp)是一种简单.现代.面向对象并且类型安全的编程语言.C# 源于 C 语言家族,因此 C.C++ 和 Java 工程师们能迅速上手.ECMA 国际[1](ECMA Inte ...

  7. Effective java第一章引言

    菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...

  8. 第一章-第十一题(请问 “软件” 和 “软件工程” 这些词汇是如何出现的 - 何时、何地、何人)--By 侯伟婷

    从邹欣老师的<构建执法:现代软件工程>一书中,我们得到有关这些名词的起源的信息是软件工程的概念是1968年第一次提出的[1].而在一篇专访Margaret Hamilton的报道中,我们通 ...

  9. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

随机推荐

  1. SQL点滴27—性能分析之执行计划

    原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<I ...

  2. IntelliJ IDEA 13 破解安装(JRebel 5.6.3a皴)

    首先安装IntelliJ 13,记住下载Ultimate Edition版本号,否则就必须打破..   安装到本地.然后一些配置(这一步不能.不过考虑到交换系统后,保存,建议做) 打开{install ...

  3. Windows版Cacti全新安装与升级

    全新安装 Cacti运行依赖的软件很多,mysql.PHP.Apache.Spine.rrd等,一个一个的安装非常繁琐,而且还容易出错,全新安装的话可以采用论坛提供的windows安装包安装,非常简单 ...

  4. 单独一个img标签的居中显示

    针对页面当中通过img插入图片的时候,要保证这个图片在页面内容当中居中,一般的做法是在外面套一个div,通过给div加入 {margin:0 auto;} 来控制图片的居中. 那么如果针对后台上传的图 ...

  5. git简单教材

    0)初始化 $ git config --global user.name "xxx" $ git config --global user.email "xxx@gma ...

  6. UrlRouting的理解

    UrlRouting的理解 文章内容 根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHand ...

  7. Android L新控件RecyclerView简介

    Android L是android进化史上的里程碑,尽管还没有正式发布4.5或者5.0,但预览版也同样精彩. 这篇文章只是另外一篇博客的总结性翻译,能够读懂原文的,可以点开这个链接去阅读精彩的原文:h ...

  8. [翻译]HBase 中的 ACID

    同前面翻译的一篇关联的,同作者的另一篇:ACID in HBase 这一篇不是单纯地描述一个问题,而是以 ACID 为主题,介绍了其在 HBase 中各个部分的体现及实现. ACID,即:原子性(At ...

  9. NET那点不为人知的事

    ASP.NET那点不为人知的事(一)   我们上网时,在浏览器地址输入网址:Http://www.cnblogs.com,按下回车,一张网页就呈现在我们眼前.这究竟发生了什么?对于一名优秀的Progr ...

  10. Linq无聊练习系列4--join练习

    /**************join 练习*******************/            //对于1对多关系            var list =from c in ctx.T ...