其中关于模式的描述来自:《Head First 设计模式》,括号内某些为个人理解,不代表正确
OO设计原则 写道
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不要依赖具体类
只和“朋友”交谈
别找我,我会找你
类应该只有一个改变的理由
模式 写道
模式是在某情境(context)下,针对某问题的某种解决方案。
情境就是应用某个模式的情况。这应该是会不断出现的情况。
问题就是你想在某情境下达到的目标,但也可以是某情境下的约束。
解决方案就是你所追求的:一个通用的设计,来解决约束,达到目标。
策略模式:
定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
(好像现在常用的DAO,Service就是这个模式)
观察者模式:
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
(在Java中已经提供了java.util.Observable和java.util.Observer来实现,也可以通过自己实现。暂时还没碰到类似的应用场景)
装饰模式:
动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
(可以这样理解:一杯纯的咖啡,现在需要加牛奶,那么牛奶就是装饰了咖啡)
工厂模式(Factory):
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
所有的工厂都是用来封装对象的创建。
简单工厂:不是真正的设计模式,但不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂方法:使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂:使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中,也就是抽象工厂的实现类中。
(分为抽象工厂和简单工厂模式,简单工厂模式主要可以对代码进行解耦,抽象工厂就是定义一个工厂接口,然后由不同的工厂去实现,工厂方法就是在某个逻辑类中有类似createObject,但是这个createObject由具体子类去实现)
单例模式(Singleton):
确保一个类只有一个实例,并提供全局访问点。在Java中实现单例模式需要私有的构造器,一个静态方法和一个静态变量。
(主要是要处理好多线程创建实例的问题,可应用于系统配置之类的地方)
命令模式(Command):
将请求封装成对象,这样可以让你使用不同的请求,列队,或者日志请求来参数化其他对象,命令模式也可以支持撤销操作。
(主要是定义一个Command接口,然后有众多的Command实现,而CommandExecuter只负责调用Command实例的execute方法,从而不用管具体实现,达到扩展开放,修改封闭。可用于列队任务等)
适配器模式(Adapter):
将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
(当需要使用一个现有的类而其接口并不符合你的需求时,就使用适配器。适配器改变接口以符合客户的期望)
外观模式(Facade):
提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
在方法中只应该调用:该对象本身;被当作方法参数而传递进来的对象;此方法所创建或实例化的任何对象;该对象的任何组件。
(当需要简化并统一一个很大的接口或者一群复杂接口时,使用外观。外观将客户从一个复杂的子系统中解耦)
引用
适配器将一个对象包装起来以改变其接口;
装饰者将一个对象包装起来以增加新的行为和责任;
而外观将一群对象“包装”起来以简化其接口
模板方法模式:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法的抽象类可以定义具体的方法、抽象方法和钩子。
迭代器模式:
提供一种方式顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
迭代器允许访问聚合元素,而不需要暴露它的内部结构。
迭代器将便利聚合的工作封装进一个对象中。
当使用迭代器的时候,我们依赖聚合提供遍历。
迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
(如,有两个类,其中使用了不同的集合类型存储了数据,如果针对具体集合类型编写代码会造成大量冗余代码,提供一个统一的转换为迭代的接口,可使代码依赖性降低)
组合模式:
允许你将对象组成树形结构来表示“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
(这个模式也就是建立树形的对象组,但总觉得其概念上有点问题。)
状态模式:
允许对象在内部状态改变时改变它的行为,对象看起来好像改变了它的类。
状态模式允许一个对象基于内部状态而拥有不同的行为。
代理模式:
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
远程代理:管理客户和远程对象之间的交互。
虚拟代理:控制访问实例开销大的对象。
保护代理:基于调用者控制对对象方法的访问。
复合模式:
符合模式结合两个或两个以上的模式,组成一个解决方案,解决一再发生的一般性问题。
MVC是符合模式,结合了观察者模式、策略模式和组合模式。
模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦。
控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。
视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。
Model 2是MVC在Web上的应用。
在Model 2中,控制器实现成Servlet,而JSP/HTML实现视图。
分享到:
相关推荐
设计模式笔记是对这些模式的深入理解和应用记录,可以帮助开发者在面对复杂系统设计时,快速找到合适的结构和策略。以下是关于设计模式的一些核心知识点: 1. **设计模式的分类**: - 创建型模式:如单例...
笔记可能记录了作者在阅读和理解各种开源项目源码过程中的思考和感悟,包括但不限于常见的设计模式(如单例、工厂、观察者模式等)、数据结构与算法的应用、模块化和面向对象的设计原则。此外,对于特定语言如Java、...
### 软件测试学习笔记知识点详解 #### 一、软件测试基础知识 1. **软件测试定义** - **理解**:软件测试是通过执行软件产品来评估其质量的过程。 - **目的**:确保软件产品能够满足用户的需求并达到预定的质量...
最后,笔记中提到的更新记录显示了作者对学习笔记的持续投入和努力,从2012年12月开始,到2013年1月结束初稿编写。而最后完成的校对工作则表明了作者对内容准确性的重视。 通过这份学习笔记,初学者可以更系统地...
《Koa2进阶学习笔记》是一份详细记录Koa2框架高级特性和实践的资源,旨在帮助开发者深入理解并熟练运用Koa2。作为Node.js领域的轻量级Web框架,Koa2以其简洁的API设计和强大的中间件机制赢得了广大开发者的喜爱。这...
《功能安全学习笔记20230806》是一份关于功能安全的个人学习记录,旨在为读者提供一个补充性的知识框架。虽然它不是全面的培训材料,也没有包含具体的实例,但可以从宏观上帮助理解功能安全的重要概念,特别是在汽车...
本学习笔记主要涵盖了Java后端开发的基础知识、核心技术以及常见框架,旨在帮助初学者和进阶者深入理解Java后端开发。 一、Java基础 Java后端开发首先需要掌握Java语言的基本语法,包括数据类型、控制结构(如if...
以上只是部分内容概览,实际的学习笔记可能还包含了更多关于异常处理、多线程、网络编程、文件操作、设计模式等方面的细节。结合提供的图像资源,可能还涵盖了图形化的环境配置步骤或者示例应用的截图,这些都能帮助...
1. **IoC(Inversion of Control)** 指的是控制反转,它是一种设计思想,在Java开发中常用的一种设计模式,用于实现解耦合。在传统的应用程序中,通常由开发者负责对象的创建和管理,而在IoC容器中,这些工作交给了...
在学习笔记系统中,MyBatis用于执行CRUD(创建、读取、更新、删除)操作,实现数据库与Java对象之间的映射。 4. **Java**:作为基础编程语言,Java在这套系统中负责编写所有的后端代码。它具有良好的跨平台性,且在...
9. **高级主题**:包括内存管理、多线程编程、设计模式等,这些都是进阶学习的内容,能够帮助开发者编写更高效、更健壮的程序。 10. **实践项目**:理论学习与实践相结合,通过完成一些小项目,巩固和提升C++编程...
在UNIX学习笔记中,你将了解到以下核心知识点: 1. **文件和目录管理**:包括创建、删除、移动和重命名文件及目录的命令,如`mkdir`、`touch`、`rm`、`mv`和`cp`。另外,还有`cd`用于切换目录,`ls`用于列出目录...
这个"Struts2_学习笔记"包含了关于Struts2框架的深入学习资料,是理解并掌握Struts2核心概念和技术的关键。 Struts2的核心设计理念是模型-视图-控制器(MVC)架构模式,它简化了Java Web开发,将业务逻辑、数据展示...
这份个人学习笔记将深入探讨iOS开发的核心概念、工具、流程以及最佳实践。 首先,我们要了解iOS开发的基础——Swift编程语言。Swift是Apple在2014年推出的一种现代、安全、强大的编程语言,用于构建iOS、iPadOS、...
ASP.NET Core Web API 学习笔记汇总.pdf 是一个聚焦于使用ASP.NET Core构建Web API的资源集合。ASP.NET Core是一个由微软开发的现代化、高性能、开源的框架,它旨在为开发者提供构建各种类型的应用程序的能力,包括...
Django是Python中的一个强大Web框架,它遵循MVT(Model-View-Template)设计模式,能够快速开发高效、安全的Web应用。学习Django,你需要掌握如何创建项目和应用,理解模型(Model)用于数据建模,视图(View)处理...
- 无监督学习(Unsupervised Learning):与监督学习相反,无监督学习中训练数据仅包含输入,没有预期输出,算法的目标是发现数据中的结构和模式。 - 聚类(Clustering):无监督学习的一种,目的是将相似的数据点...
软件工程笔记涵盖敏捷开发方法、需求分析、设计模式、测试策略和版本控制工具(如Git)的使用。这些内容帮助团队协作,确保软件产品的质量和可维护性。 项目管理笔记则关注时间管理、风险管理、团队协作和沟通技巧...
Oracle学习笔记是数据库管理员、开发人员以及对数据库技术感兴趣的初学者的理想资源。Oracle数据库系统是全球最广泛使用的商业关系型数据库管理系统之一,以其强大的功能、高效性和可扩展性著称。以下是一些Oracle...