Head First 设计模式
1,策略模式
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
oo基础:抽象,封装,多态,继承
oo原则:封装变化,多用组合,少用继承,针对接口编程,不针对实现编程
oo模式:策略模式。
2,观察者模式(Observer)
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
优点:松耦合
00基础:抽象
00原则:封装变化,多用组合,少用继承,针对接口编程,不针对实现编程,为交互对象之间的松耦合设计而努力,
00模式:观察者模式
3,装饰者模式
开放-关闭原则:类应该对扩展开放,对修改关闭。
装饰着和被装饰着对象有想通的超类型。
你可以用一个或者多个装饰着包装一个对象。
既然装饰着和被装饰对象有想通的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象替代它。
装饰着可以在所委托被装饰着的行为之前与/或之后,加上自己的行为,以达到特定的目的。
对象可以在任何时候被装饰,所以可以在运行时态的,不限量的用你喜欢的装饰着来装饰对象。
装饰着模式:动态的将责任附加在对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
继承是有了正确的类型,而不是继承它的行为,行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。
例子:java的I/O流就是采用装饰者模式
00原则:封装变化,多用组合,少用继承,针对接口编程,不针对实现编程,为交互对象之间的松耦合设计而努力,对扩展开放,对修改关闭
4,工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
简单工厂与工厂方法的区别:简单工厂把全部的事情,在一个方法都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。
优点:将创建对象的代码集中在一个对象或者方法中,可以避免代码中的重复,并且更方便以后的维护,这也意味着客户在实例化对象时,只会依赖于接口,而不是具体类,让代码更具有弹性。
依赖倒置原则:要依赖抽象,不要依赖具体类。
变量不可以持有具体类的引用。不要让类派生自具体类。不要覆盖基类中已实现的方法。
4.1,抽象工厂模式(不懂)
提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
工厂方法与抽象工厂区别:都是为了创建对象。工厂方法用的方法是继承,抽象用的是对象组合。工厂方法创建对象需要扩展一个类,并覆盖它的工厂方法。通过子类来创建对象。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法,要想使用这个工厂必须先实例化它,然后将它传入一些针对抽象类型所写的代码中。
5,单件模式
确保一个类只有一个实例,并提供一个全局访问点。
多线程问题是那种解决方法:
(1)同步getInstance()方法
(2)使用急切创建实例
(3)双重检查加锁
6,命令模式
将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
命令模式的用途:队列请求,日志请求,
7,适配器模式
将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不可兼容的类可以合作无间。
适配器分为两种:对象适配器(组合)和类适配器(继承)
7.1外观模式
提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用(让接口更简单)。
外观模式并没有封装子系统,如有需要还是可以直接访问子系统的接口。
外观不只是简化了接口,也将客户从组件的子系统中解耦。
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同接口
最少知识原则:只和你的密友谈话。
8,模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
用途:排序,数组的排序就采用了模板方法模式,InputStream类的一个read()方法也是模板方法模式
9,迭代器模式
提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露其内部的表示。
9.1组合模式(没懂)
允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合能让客户以一直的方式处理个别对象以及对象组合。
10,状态模式
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
11,代理模式
为另一个对象提供一个替身或者占位符以控制对这个对象的访问。
使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。
11.1远程代理
远程代理可以作为另一个JVM上对象的本地代表,调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。(理解:就像驻场代表,传达客户与自己公司的意思。)
11.2 虚拟代理
虚拟代理作为创建开销大的对象的代表,虚拟代理经常直到我们真正需要一个对象的时候才创建它,当对象在创建钱和创建中时,由虚拟代理来扮演对象的替身,对象创建后,代理就会将请求直接委托给对象。
11.3动态代理
动态代理之所以称为动态,是因为运行时才将它的类创建出来,代码开始执行时,还没有proxy类,它是根据需要从你传入的接口集创建的。
InvocationHandler不是代理类,只是帮助proxy的类。
代理类有一个静态方法,叫做isProxyClass(),这个方法的返回值如果是true,就表示这是一个动态代理类。
11.4防火墙代理
控制网络资源的访问,保护主题免于“坏客户”的侵害。
11.5只能引用代理
当主题被引用时,进行额外的动作,例如计算一个对象呗引用次数。
11.6缓存代理
为开销大的运算结果提供暂时储存,它也允许多个客户共享结果,以减少计算或网络延迟。
11.7同步代理
在多线程的情况下为主题提供安全的访问。
11.8复杂隐藏代理
用来隐藏一个类的复杂几个的复杂度,并进行访问控制,
11.9写入时复制代理
用来控制对象的复制,方法是延迟对象的复制,知道客户真的需要为止。
12复合模式
复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。
MVC是复合模式,结合了观察者模式,策略模式和组合模式。
模型使用观察者模式,以便观察者更新,同事保持两者之间的解耦。
控制器是视图的策略,视图可以使用不用的控制器实现,得到不同的行为。
视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板,框架和按钮。
适配器模式用来将新模型适配成已有的视图和控制器。
13
模式是在某情景下,针对某问题的某种解决方案。
Head First 设计模式相关推荐
- 【Design pattern】设计模式思路总结(一)
看了一周的设计模式,跟着小菜的思路走! 从简单工厂过渡策略,后面看的这几个模式都是在单一职责,开放--封闭原则,依赖倒转原则下不断的改进,采用模式写出的代码更容易扩展,维护! 比较容易懂. 装饰模式: ...
- GOF23设计模式(结构型模式)代理模式~
代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
- GOF23设计模式(创建型模式)单例模式
目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...
- Python七大原则,24种设计模式
七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责. 2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE ...
- Java设计模式:单例模式
学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例 , 保证一个类 ...
- 设计模式中的六大基本原则
软件设计中的基本共识: 1,高内聚,低耦合:如果想使软件系统架构稳定,那么我们期望软件的各模块内元素结合的紧密,而模块之间的耦合度(关联性)越低越好.高内聚不仅体现在模块上,单独的类或方法也应该是内聚 ...
- JS中的7种设计模式
第九章Refactoring to OOP Patterns 重构为OOP模式 7种设计模式: 1,模版方法模式(template method) 2,策略模式(strategy) 3,状态模式(st ...
- 设计模式之创建型汇总
设计模式 创建型 工厂方法模式 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 使用场景: 创建对象需要大量重复的代码 客户端(应用层)不依 ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
最新文章
- 重磅!6.7亿美元!F5喜提开源服务器Nginx
- flink scala shell命令行使用示例
- 程序员的10大编程技巧
- 解决“Maven项目中的Dynamic Web Module 3.0 requires Java 1.6 or newer”问题
- 哈老师一到的飞鸽传书
- Python subprocess命令行中文乱码
- PHP 实现定时任务的几种方法
- 为什么Python没有属性赋值的“with”语句?
- 需求分析的故事——如何练就需求分析的火眼金晴?
- 软件测试工程师,一个即将消失的职位?
- 扫地机器人石头爬坡_都这么强了,还要怎么升级:真实评测石头T6扫地机器人...
- Visual C# 2005 编译器选项
- java根据业务排序利用Comparator.comparing自定义排序规则
- 微信公众号获取关注页面链接
- java word导出表格_Java Word模板导出包含表格单元格合并
- CSS filter有哪些神奇用途
- 华大HC32F460芯片
- 【容易打工网】大学生职场励志箴言励志语录
- 新浪微博,腾讯微博mysql数据库主表猜想
- 51单片机学习1:C语言基础