HeadFirst设计模式 读书笔记3
适配器模式与外观模式:以不同的目的,包装某些对象,让它们的接口看起来不像自己而像是别的东西。
这样就可以在设计中,将类的接口转换成想要的接口。
适配器模式解析
客户 - 适配器 - 被适配器
客户使用适配器的过程如下:
客户通过目标接口调用适配器的方法对适配器发出请求。
适配器使用被适配者接口把请求转换成被是配置的一个或多个调用接口。
客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
外观不只是简化了接口,也将客户从组件的子系统中解耦。
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同接口。
外观模式
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
设计原则:最少知识原则:只和你的密友谈话。
要点
当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
当需要简化并统一一个很大的接口或者一群发杂的接口时,使用外观。
适配器改变接口以符合客户的期望。
外观将客户从一个复杂的子系统中解耦。
实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定。
实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
适配器模式有两种形式:对象适配器和类适配器,类适配器需要用到多重继承。
你可以为一个子系统实现一个以上的外观。
适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的行为和责任,而外观将一群对象包装起来以简化其接口。
唉!在需要进入这个洞之前他原本是个好老板的,结果这全部都编程了我的工作了。你懂我的意思吧?他根本就不见人影!
我们将要深入封装算法块,好让子类可以在任何时候都可以将自己挂接进运算里。
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
设计原则:好莱坞原则:别调用(打电话给)我们,我们会调用(打电话)你。
高层组件对待低层组件的方式是:别调用我们,我们会调用你。
要点:
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法模式为我们提供了一种代码复用的重要技巧。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何已经何时调用低层模块。
你将在真实世界代码中看到模块方法模式的许多变体,不要期待它们全都是一眼就被你认出来的。
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模板方法的一种特殊版本。
良好管理的集合 “当然我把集合都好好地封装起来了”
我们能学习如何让客户遍历你的对象而又无法窥视你存储对象的方式;也将学习如何创建一些对象超集合,能够一口气就跳过某些让人望而生畏的数据结构;还将学写到一些关于对象职责的知识。
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。
迭代器模式让我们能游走于聚合内的每一个元素,而不是暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
设计原则:一个类应该只有一个引起变化的原因。
类的每个责任都有改变的潜在区域。超过一个责任,意味着超过一个改变的区域。
这个原则告诉我们,尽量让每个类保持单一责任。
组合模式
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一直的方式处理个别对象以及对象组合。
组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
空迭代器
NullIterator,返回一个迭代器,而这个迭代器得hasNext永远返回false。
要点
迭代器允许访问聚合的元素,而不需要暴露它的内部结构。
迭代器将遍历聚合的工作封装进一个对象中。
当使用迭代器的时候,我们依赖聚合提供遍历。
迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
我们应该努力让一个类只分配一个责任。
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
在实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。
这样就可以在设计中,将类的接口转换成想要的接口。
适配器模式解析
客户 - 适配器 - 被适配器
客户使用适配器的过程如下:
客户通过目标接口调用适配器的方法对适配器发出请求。
适配器使用被适配者接口把请求转换成被是配置的一个或多个调用接口。
客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
外观不只是简化了接口,也将客户从组件的子系统中解耦。
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同接口。
外观模式
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
设计原则:最少知识原则:只和你的密友谈话。
要点
当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
当需要简化并统一一个很大的接口或者一群发杂的接口时,使用外观。
适配器改变接口以符合客户的期望。
外观将客户从一个复杂的子系统中解耦。
实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定。
实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
适配器模式有两种形式:对象适配器和类适配器,类适配器需要用到多重继承。
你可以为一个子系统实现一个以上的外观。
适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的行为和责任,而外观将一群对象包装起来以简化其接口。
唉!在需要进入这个洞之前他原本是个好老板的,结果这全部都编程了我的工作了。你懂我的意思吧?他根本就不见人影!
我们将要深入封装算法块,好让子类可以在任何时候都可以将自己挂接进运算里。
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
设计原则:好莱坞原则:别调用(打电话给)我们,我们会调用(打电话)你。
高层组件对待低层组件的方式是:别调用我们,我们会调用你。
要点:
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法模式为我们提供了一种代码复用的重要技巧。
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
钩子是一种方法,它在抽象类中不做事,子类可以选择要不要去覆盖它。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。
好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何已经何时调用低层模块。
你将在真实世界代码中看到模块方法模式的许多变体,不要期待它们全都是一眼就被你认出来的。
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模板方法的一种特殊版本。
良好管理的集合 “当然我把集合都好好地封装起来了”
我们能学习如何让客户遍历你的对象而又无法窥视你存储对象的方式;也将学习如何创建一些对象超集合,能够一口气就跳过某些让人望而生畏的数据结构;还将学写到一些关于对象职责的知识。
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。
迭代器模式让我们能游走于聚合内的每一个元素,而不是暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
设计原则:一个类应该只有一个引起变化的原因。
类的每个责任都有改变的潜在区域。超过一个责任,意味着超过一个改变的区域。
这个原则告诉我们,尽量让每个类保持单一责任。
组合模式
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一直的方式处理个别对象以及对象组合。
组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
空迭代器
NullIterator,返回一个迭代器,而这个迭代器得hasNext永远返回false。
要点
迭代器允许访问聚合的元素,而不需要暴露它的内部结构。
迭代器将遍历聚合的工作封装进一个对象中。
当使用迭代器的时候,我们依赖聚合提供遍历。
迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
我们应该努力让一个类只分配一个责任。
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
在实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.