博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA设计模式之【观察者模式】
阅读量:6040 次
发布时间:2019-06-20

本文共 2352 字,大约阅读时间需要 7 分钟。

观察者模式    交通信号灯是汽车的观察目标,汽车是观察者    一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化    为了描述这种一对多或一对一的联动,观察者模式应运而生    在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。    别名        发布与订阅模式        模型与视图模式        源监听模式        从属者模式    角色        Subject目标、主题、被观察对象            定义观察者集合            提供方法增加和删除观察者对象            定义通知方法notify            可以是接口、抽象类或具体类        ConcreteSubject具体目标            包含经常发生改变的数据            状态改变向观察者发出通知        Observer观察者            对观察目标的改变做出反应            声明更新数据的方法update        ConcreteObserver具体观察者            存储具体观察者的状态            实现update方法            调用目标类的attach方法,加入集合            或通过detach方法将自己从目标类的集合中删除

看例子

1.抽象观察目标

package Observer;/** * Created by Jiqing on 2016/10/28. */import java.util.*;public abstract class MySubject{    protected ArrayList observers = new ArrayList();    //注册方法    public void attach(MyObserver observer)    {        observers.add(observer);    }    //注销方法    public void detach(MyObserver observer)    {        observers.remove(observer);    }    public abstract void cry(); //抽象通知方法}

2.具体观察目标,猫

package Observer;/** * Created by Jiqing on 2016/10/28. */public class CatSubject extends MySubject{    public void cry() {        System.out.println("猫叫!");        System.out.println("----------------------");        for(Object obj:observers) {            ((MyObserver)obj).response();        }    }}

3.抽象观察者

package Observer;/** * Created by Jiqing on 2016/10/28. */public interface MyObserver{    void response();  //抽象响应方法}

4.具体观察者

package Observer;/** * Created by Jiqing on 2016/10/28. */public class DogObserver implements MyObserver{    public void response() {        System.out.println("狗跟着叫!");    }}
package Observer;/** * Created by Jiqing on 2016/10/28. */public class PigObserver implements MyObserver{    public void response() {        System.out.println("猪也哄哄乱叫!");    }}

5.调用过程

package Observer;/** * Created by Jiqing on 2016/10/28. */public class Client {    public static void main(String a[])    {        MySubject subject=new CatSubject();        MyObserver obs1,obs2;        obs1=new DogObserver();        obs2=new PigObserver();        subject.attach(obs1);        subject.attach(obs2);        subject.cry();    }}

执行结果:

猫叫!----------------------狗跟着叫!猪也哄哄乱叫!

点评:

猫叫带动狗叫和猪叫~
例子不在于多复杂,在于能把概念阐述清晰。

看关系图

422101-20161028233440437-806486270.png

本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6009750.html,如需转载请自行联系原作者

你可能感兴趣的文章
SQL UPDATE实现多表更新
查看>>
最近有个需求,就是把某个网址跳转到另外一个网址
查看>>
innobackupex 在增量的基础上增量备份
查看>>
Windows Server 2012 R2 DirectAccess功能测试(2)App1服务器安装及配置
查看>>
基于清单的启动器的实现
查看>>
外网用户通过citrix打印慢的解决方法
查看>>
STL容器的使用
查看>>
关于std::map
查看>>
JXL导出Excel文件兼容性问题
查看>>
VBoot1.0发布,Vue & SpringBoot 综合开发入门
查看>>
centos7 安装wps 后 演示无法启动
查看>>
git简单命令
查看>>
LAMP编译部署
查看>>
XenDesktop7.6安装部署入门教程
查看>>
HashMap的工作原理及HashMap和Hashtable的区别
查看>>
GregorianCalendar日历程序
查看>>
Sublime 中运行 Shell 、Python、Lua、Groovy...等各种脚本
查看>>
Selenium的 WebDriverWait 研究
查看>>
Liferay 中部署portlet的细节窥探
查看>>
制作Windows Server 2003/08 image详细步骤与OpenStack介绍
查看>>