第一章 引言

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

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. 且看三星刚发布的Smart TV如何窃听你的枕边细语

    三星最新的SmartTV有一个很酷的新的声控功能,网络连接设备可以通过它来录下你说过的所有内容并把它上传到一个第三方的地方进行存储. 该公司的语音识别软件允许用户跟他们的电视通过声音来进行沟通.一旦电 ...

  2. The operator == is undefined for the argument type(s) int, null

    package cn.edu.shu.web.test; public class TestInteger { public static void main(String[] args) { /** ...

  3. TestNg的xml配置

    TestNG中,可以通过配置xml来运行某一类.包.方法. 1.通过TestNg运行某一个类 <?xml version="1.0" encoding="UTF-8 ...

  4. SQLServer中处理每天四亿三千万记录

    我是如何在SQLServer中处理每天四亿三千万记录的   首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地 ...

  5. 实例学习SSIS(二)--使用迭代

    原文:实例学习SSIS(二)--使用迭代 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)-- ...

  6. 02.零成本实现WEB性能测试-基于APACHE JMETER

    书评: 1.这本是介绍性能测试工具Jmeter的书籍,维度还够,但是粒度太粗. 2.对于想快速了解JMeter的使用和工具的原件使用,还是有一定的参考价值. 3.实际上,这本书可用来快速入门,掌握和了 ...

  7. .NET编程规范

    .NET开发编程规范 第1章 程序的版式 版式虽然不会影响程序的功能,但会影响可读性.程序的版式追求清晰.美观,是程序风格的重要构成因素. 可以把程序的版式比喻为"书法".好的&q ...

  8. Content Negotiation(内容协商)

    Asp.Net Web API 2第十四课——Content Negotiation(内容协商)   前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http:// ...

  9. 线程池python

    原创博文,转载请注明出处 今天在学习python进程与线程时,无意间发现了线程池threadpool模块,见官方文档. 模块使用非常简单,前提是得需要熟悉线程池的工作原理. 我们知道系统处理任务时,需 ...

  10. CODEFORCES#274 DIV2

    A[傻逼题] 大意:给你a,b,c三个数,你可以在其中加上括号,加号,乘号,使得到的值最大 就是问你 a+b+c,a*(b+c),(a+b)*c,a*b*c,(a+c)*b 哪个最大! 我去...这不 ...