关于基本的OOP特征:

OOP的几大特征是抽象 继承 封装 多态。

我们把共同的部分抽象出来作为抽象类的存在,使用继承和接口来实现多态,然后私有的部分封装起来。一定程度上说,这些概念都是简单的设计模式。

设计原则1:

找出应用中可能需要变化的部分,把他们独立出来,不要和那些不需要变化的部分融合在一起。

设计原则2:

针对接口编程,而不是针对实现编程。

这里的接口包含抽象类。

设计原则3:

多用组合 少用继承。

组合和继承都能作为将不变的代码和变化的代码分开的方式,但是组合更加灵活,可以将一个依赖的行为封装为一个类,然后通过接口的方式引入,这样不会依赖于类的层级结构,而且可以在运行的时候动态改变(通过set方法改变依赖的组合对象)。

通俗的讲,继承是一种"是一个"的关系,组合是一种"有一个"的关系,大部分情况下我们需要的都是"有一个"。

策略模式:

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。

个人觉得,一定程度上说,策略模式就是组合的简单实用场景。如,鸭子的"叫"行为,不同的鸭子这种行为变现不同,有的呱呱叫,有的不会叫,我们把这种行为设置为一个接口,然后定义几种不同的叫的实现,以组合的方式注入到不同的鸭子里。策略模式常见到都不能认为是一种模式了,已经是一种通用的编码方式了。

观察者模式

有时被称作发布/订阅((pub/sub))模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

在发布订阅模式的说法中,发布者发布pubscribe消息,订阅者订阅subscribe消息。

在观察者模式的说法中,分为主题(Subject),观察者(Observer)。

其中主题(Subject)的接口是:

  • 增加观察者(Observer接口)
  • 移除观察者
  • 向观察者(们)发出通知

观察者(Observer)的接口是:

  • update方法。接收主题的通知。

java内置了观察者模式,其中:

java.util.Observable类代表主题。方法如下:

构造方法摘要

Observable()
构造一个带有零个观察者的 Observable。

 

 

方法摘要

void

addObserver(Observer o)
如果观察者与集合中已有的观察者不同,则向对象的观察者集合中添加此观察者。

protected void

clearChanged()
指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。

int

countObservers()
返回 Observable 对象的观察者数目。

void

deleteObserver(Observer o)
从对象的观察者集合中删除某个观察者。

void

deleteObservers()
清除观察者列表,使此对象不再有任何观察者。

boolean

hasChanged()
测试对象是否改变。

void

notifyObservers()
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。

void

notifyObservers(Object arg)
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。

protected void

setChanged()
标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。

 

 

public interface Observer接口代表观察者。方法如下:

 

方法详细信息

update

void update(Observable o,

Object arg)

只要改变了 observable 对象就调用此方法。应用程序调用 Observable 对象的 notifyObservers 方法,以便向所有该对象的观察者通知此改变。

参数:

o - observable 对象。

arg - 传递给 notifyObservers 方法的参数。

 

 

 

Head First设计模式 1 设计模式入门 策略模式 观察者模式的更多相关文章

  1. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  2. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  3. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  4. php设计模式课程---6、策略模式如何使用

    php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...

  5. php设计模式-------(1)策略模式

    一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...

  6. 【HeadFirst 设计模式总结】1.策略模式

    1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...

  7. head first 设计模式读书笔记 之 策略模式

    作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...

  8. headfirst设计模式(1)—策略模式

    什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...

  9. javascript设计模式详解之策略模式

    接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...

随机推荐

  1. 第一个python-ui界面

    首先是安装eric6简直是个灾难,先是找不到汉化版的eric6,好不容易找到了,一打开eric6的窗体就说designer.exe不存在,确实在PyQt5里没有,明明在PyQt5-tools里面有,最 ...

  2. centos7/redhat7安装mycli

    一.mycli介绍 MySQL的命令行客户端,可以执行自动完成和语法突出显示. 主页:http://mycli.net文档:http://mycli.net/docs github:https://g ...

  3. 【计算机视觉】【神经网络与深度学习】论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection

    尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名 ...

  4. 【Python开发】urllib2异常处理

    一.urllib2模块回顾 urllib2模块中最重要的函数是urlopen()函数,用于获取URLs资源(Uniform Resorce Locators).urlopen函数不仅可以用于简单的情况 ...

  5. 再谈Java数据结构—分析底层实现与应用注意事项

    在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...

  6. Swool的安装与使用

    1.swoole的安装 //php最好用7.2以上的.直接去网站下载下来,然后与php一样编译安装. git下来后,因为没有config文件,故先在swool下载目录下执行: /.../php/bin ...

  7. JAVA第四周总结

    Java实验报告二 第一题 写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String ...

  8. Quartz持久化到mongodb

    springboot中集成quzrtz ,持久到mongodb 1.pom引用 <?xml version="1.0" encoding="UTF-8"? ...

  9. 编写java 程序与Linux进行远程连接并运行linux下的脚本

    我这里是通过连接到centos6.5的大数据集群的主节点,并通过运行hadoop的启动脚本来启动hadoop 本人采用的是SSH的方式连接 通过创建maven项目来编写代码,在编写代码之前需要先导入架 ...

  10. vs nuget找不到包

    nuget.org https://api.nuget.org/v3/index.json