Head First设计模式 1 设计模式入门 策略模式 观察者模式
关于基本的OOP特征:
OOP的几大特征是抽象 继承 封装 多态。
我们把共同的部分抽象出来作为抽象类的存在,使用继承和接口来实现多态,然后私有的部分封装起来。一定程度上说,这些概念都是简单的设计模式。
设计原则1:
找出应用中可能需要变化的部分,把他们独立出来,不要和那些不需要变化的部分融合在一起。
设计原则2:
针对接口编程,而不是针对实现编程。
这里的接口包含抽象类。
设计原则3:
多用组合 少用继承。
组合和继承都能作为将不变的代码和变化的代码分开的方式,但是组合更加灵活,可以将一个依赖的行为封装为一个类,然后通过接口的方式引入,这样不会依赖于类的层级结构,而且可以在运行的时候动态改变(通过set方法改变依赖的组合对象)。
通俗的讲,继承是一种"是一个"的关系,组合是一种"有一个"的关系,大部分情况下我们需要的都是"有一个"。
策略模式:
定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。
个人觉得,一定程度上说,策略模式就是组合的简单实用场景。如,鸭子的"叫"行为,不同的鸭子这种行为变现不同,有的呱呱叫,有的不会叫,我们把这种行为设置为一个接口,然后定义几种不同的叫的实现,以组合的方式注入到不同的鸭子里。策略模式常见到都不能认为是一种模式了,已经是一种通用的编码方式了。
观察者模式
有时被称作发布/订阅((pub/sub))模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
在发布订阅模式的说法中,发布者发布pubscribe消息,订阅者订阅subscribe消息。
在观察者模式的说法中,分为主题(Subject),观察者(Observer)。
其中主题(Subject)的接口是:
- 增加观察者(Observer接口)
- 移除观察者
- 向观察者(们)发出通知
观察者(Observer)的接口是:
- update方法。接收主题的通知。
java内置了观察者模式,其中:
java.util.Observable类代表主题。方法如下:
|
构造方法摘要 |
|
|
Observable() |
|
|
方法摘要 |
|
|
void |
addObserver(Observer o) |
|
protected void |
clearChanged() |
|
int |
countObservers() |
|
void |
deleteObserver(Observer o) |
|
void |
deleteObservers() |
|
boolean |
hasChanged() |
|
void |
notifyObservers() |
|
void |
notifyObservers(Object arg) |
|
protected void |
setChanged() |
public interface Observer接口代表观察者。方法如下:
|
方法详细信息 |
update
void update(Observable o,
Object arg)
只要改变了 observable 对象就调用此方法。应用程序调用 Observable 对象的 notifyObservers 方法,以便向所有该对象的观察者通知此改变。
参数:
o - observable 对象。
arg - 传递给 notifyObservers 方法的参数。
Head First设计模式 1 设计模式入门 策略模式 观察者模式的更多相关文章
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- php设计模式课程---6、策略模式如何使用
php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...
- php设计模式-------(1)策略模式
一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...
- 【HeadFirst 设计模式总结】1.策略模式
1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...
- head first 设计模式读书笔记 之 策略模式
作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...
- headfirst设计模式(1)—策略模式
什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
随机推荐
- JavaScript DOM 编程艺术(第二版) 初读学习笔记
这本书留给我的印象就是结构.表现和行为层的分离,以及书后面部分一直在强调的最佳实践原则:平稳退化,逐步增强,向后兼容以及性能考虑. 要注意这不是一本JavaScript入门书籍~ 2.1 准备工作 用 ...
- pyQt点击事件和数据传输
首先是PushButton点击事件,点击按钮之后发送textEdit框里输入的文字到后台. def retranslateUi(self, MainWindow): _translate = QtCo ...
- MySQLdb._exceptions.OperationalError: (2059, <NULL>)
这是将 将数据迁移至mysql8.0时遇到的问题, 在网上找到了解决方案(亲测有用), 这是因为mysql8.0密码加密的问题,mysql8.0对用户密码的加密方式为caching_sha2_pass ...
- @autowired、@Qualifier、@Primary注解
@autowired 可以自动帮你把Bean里面引用的对象的setter/getter方法省略,自动帮你set/get. 启动spring IoC时,容器自动装载了一个AutowiredAnnotat ...
- 【Linux开发】linux设备驱动归纳总结(八):4.总线热插拔
linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- default.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [转帖]FreeBSD、OpenBSD、NetBSD的区别
FreeBSD.OpenBSD.NetBSD的区别 Linux 的历史 http://www.361way.com/unix-bsd/1513.html 一直unix在我心目中的地位都很高,uni ...
- 【模板】SPFA(不完全详解)
一种最短路求法(个人觉得比DIJKSTRA好用) 用于有向图. 大概思路:从根节点开始,枚举每一个点,同时更新他们所联通的点的最短路径,如果路径被更新,则把这个点入队,一直重复这个操作直到队伍为空为止 ...
- # C++中对PI的引用
#include <iostream> #include <cmath> using namespace std; int main(){ printf("%.10l ...
- python PEP8常用规范(看完你会感谢我的!)
完整的规范移步传送门 pep8规范 官方文档:[https://www.python.org/dev/peps/pep-0008/](https://www.python.org/dev/peps/p ...