<!-- 设计模式 -->
<!--是一套被反复使用、多数人知
晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了
可重用代码、让代码更容易被他人理解、保证代 码可靠性 -->
-------------------------------------------------------------
<!-- 观察者模式 observer patterns-->

<!-- 对于天气预报的举例,首先这是常规的方法 -->

public class WeatherData {

    private int low;
private int height;
private String weather; public int getLow() {
return low;
}
public int getHeight() {
return height;
}
public String getWeather() {
return weather;
} public void setData(int low,int height,String weather){
this.low = low;
this.height = height;
this.weather = weather; change();
}
private void change() { Xiaomi xiaomi = new Xiaomi();
xiaomi.disPlay(getLow(),getHeight(),getWeather()); Chuizi chuizi = new Chuizi();
chuizi.disPlay(getLow(),getHeight(),getWeather());
} }
public class Xiaomi {

    public void disPlay(int low, int height, String weather) {
System.out.println(low + ":" + height + ":" + weather);
} }
public class Chuizi {
public void disPlay(int low, int height, String weather) {
System.out.println(low + ":" + height + ":" + weather);
}
}

但是这是有问题的,不够灵活,有的厂商想加上这个功能,有的厂商想去掉这个功能
就像报纸
出版社的任务就是出报纸
你订阅了出版社的报纸,出版社就会将新的报纸给你送
你不需要该出版社的报纸,可以取消订阅
只要出版社还在,就会一直有很多人取消或订阅报纸

观察者模式
定义了对象间一对多的依赖,这样一来,当一个对象的状态改变时,
它的所有依赖都会自动收到通知并自动更新
报社是主题,订阅者是观察者对象

/*定义一个主题接口*/
public interface Subject { public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver(); }
/*主题要继承自主题接口,用于添加一些对观察者操作的几个方法*/
public class WeatherData implements Subject{ private int low;
private int height;
private String weather;
//定义一个list,用于存放所有观察者,方便下面进行通知
private List<Observer> list = new ArrayList<Observer>();
public int getLow() {
return low;
}
public int getHeight() {
return height;
}
public String getWeather() {
return weather;
} public void setData(int low,int height,String weather){
this.low = low;
this.height = height;
this.weather = weather;
//通知观察者
notifyObserver(); } //对观察者进行添加
@Override
public void addObserver(Observer observer) {
if(observer == null){
return;
}
if(!list.contains(observer)){
list.add(observer);
} }
//通知所有观察者
@Override
public void notifyObserver() {
for(Observer o : list){
o.update(getLow(), getHeight(), getWeather());
}
}
//删除观察者
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
} }
/*定义一个观察者接口,观察者在继承之后要实现他的方法用于更新数据*/
public interface Observer { public void update(int low,int height,String weather);
}
public class Xiaomi implements Observer{

    /**
* 对于观察者,我希望做到不管是添加该业务还是取消,主题端是不管的,所以
* 定义构造方法,new出来这个对象的时候自动加入到被通知列(成为观察者),
* 同时还设有取消该业务
*/ private Subject subject; public Xiaomi(Subject subject){
this.subject = subject;
subject.addObserver(this);
}
public void cancle(){
subject.removeObserver(this);
} public void disPlay(int low, int height, String weather) {
System.out.println(low + ":" + height + ":" + weather);
} @Override
public void update(int low, int height, String weather) {
disPlay(low,height,weather);
} }
public class Chuizi implements Observer{

        private Subject subject;

        public Chuizi(Subject subject){
this.subject = subject;
subject.addObserver(this);
}
public void cancle(){
subject.removeObserver(this);
} public void disPlay(int low, int height, String weather) {
System.out.println(low + ":" + height + ":" + weather);
} @Override
public void update(int low, int height, String weather) {
disPlay(low,height,weather);
} }

测试运行

public class test {
public static void main(String[] args) {
WeatherData data = new WeatherData(); <!-- 加入该业务 -->
Xiaomi xiaomi = new Xiaomi(data);
Chuizi chuizi = new Chuizi(data);
<!-- 两个都通知 -->
data.setData(1, 10, "晴朗");
<!-- 取消该业务 -->
xiaomi.cancle();
<!-- 只通知一个 -->
data.setData(2, 12, "晴朗"); }
}

======================================================================
======================================================================
======================================================================
java中内置的观察者模式
在这里不是实现了而是继承

public class WeatherData extends Observable {

    private int low;
private int height;
private String weather; public int getLow() {
return low;
}
public int getHeight() {
return height;
}
public String getWeather() {
return weather;
} public void setData(int low,int height,String weather) {
this.low = low;
this.height = height;
this.weather = weather;
change();
} public void change() {
/*Observable,可以点击进入Observable看里面的方法,首先setChanged()将changed属性改为true
代表有改变*/
setChanged();
/* 通知观察者 */
<!-- 方式1 -->
notifyObservers();
<!-- 方式2 -->
notifyObservers(new Object[]{getLow(),getHeight(),getWeather()});
} }
import java.util.Observable;
import java.util.Observer; public class Htc implements Observer{
/*构造方法,将自己加入通知列*/
private Observable observable;
public Htc(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
/*取消该业务 */
public void cancel() {
observable.deleteObserver(this);
} public void display(int low,int height,String weather) {
System.out.println("HTC 最低温度:" + low + " 最高温度:" + height + " 天气:" + weather);
} @Override
public void update(Observable o, Object arg) {
/*
拉模式:当要使用的时候再获取
对应上面的方式1 当创建weatherdata的时候会执行父类的构造方法 这个o是从父类中
传过来的(传的是this),所以这个o指的是weatherdata本身,强制转换*/
WeatherData wd = (WeatherData) o;
display(wd.getLow(), wd.getHeight(), wd.getWeather()); /*
推模式:不管你用不用,我先给你
对应上面的方式2 当使用notifyObservers(new Object[]{getLow(),getHeight(),getWeather()});
arg不为null*/
if(arg != null) {
Object[] array = (Object[]) arg;
display(Integer.parseInt(array[0].toString()), Integer.parseInt(array[1].toString()), array[2].toString());
} } }

测试

public class Test {

    public static void main(String[] args) {

        WeatherData wd = new WeatherData();

        Htc htc = new Htc(wd);

        wd.setData(2, 8, "晴天");

    }
}

----------------------------------------------------------------------
----------------------------------------------------------------------
对于要使用自己写的还是java内置的?
java中的主题是要继承的而不是实现的,所以当他已经有了父类的时候就不能再继承其他类

Observable是一个类,主题类只能继承该类,如果主题类已经有
了父类,则无法完成观察者模式,因为Java不支持多继承。

关于观察者模式
该模式定义了对象之间一对多的关系
主题用一个共同的接口来更新观察者
主题和观察者之间用松耦合的方式结合,主题不知道观察者的细节,只知道观察者实现了观察者接口
java中内置了观察者模式
知道使用Java中内置观察者模式的缺点
如有必要,尽量自己实现观察者模式,而不是使用Java中内置的

设计模式总结1--observer pattern的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  3. Java设计模式模式观测(Observer Pattern)

    Observer Pattern 设计模式通常用于.这是一个事件侦听器模型. 该模型有两个作用,一个是Subject, 有一个Observer.Subject 保存多个Observer参考,一旦一个特 ...

  4. 设计模式-观察者模式(Observer Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 观察者模式简述 观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色 ...

  5. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  6. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  7. 24种设计模式--观察者模式【Observer Pattern】

     <孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好 ...

  8. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

  9. 设计模式之观察者模式(Observer pattern)

    最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...

  10. 设计模式九: 观察者模式(Observer Pattern)

    简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...

随机推荐

  1. python 使用xrld

    下载xrld.要对应合适的python版本: 下载tar.gz包.解压 通过cmd进入该目录. setup.py build setup.py install 安装成功: 添加路径: from sys ...

  2. Installshield 添加应用程序到防火墙例外

    function AddProcessFwauthor() STRING szCServer,szFServer,szTmp; OBJECT objFirewall, objProfile, objC ...

  3. POJ 2406 Power Strings(字符串的最小循环节)

    题目链接:http://poj.org/problem?id=2406 题意:确定字符串最多是多少个相同的字串重复连接而成的 思路:关键是找到字符串的最小循环节 code: #include < ...

  4. javascript模块化编程(转载)

    Javascript 模块化编程 作者: 阮一峰  发布时间: 2013-01-08 18:04  阅读: 7632 次  推荐: 40   原文链接   [收藏]   随着网站逐渐变成"互 ...

  5. [转]关于 Swift 的一点初步看法

    本文转自:http://onevcat.com/2014/06/my-opinion-about-swift/ 感谢原作者 虽然四点半就起床去排队等入场,结果还是只能坐在了蛮后面的位置看着大屏幕参加了 ...

  6. C# 读书笔记之访问虚方法、重写方法和隐藏方法

    C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法:然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法). 重写方法用相同 ...

  7. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  8. Laravel + Xdebug 时需要注意的问题

    [平台环境]64bit Win7 + Wamp2.5 (php 5.5, Apache 2.4.9) [Xdebug版本]php_xdebug-2.2.5-5.5-vc11-x86_64.dll 配置 ...

  9. 先登录 在跳转到tabBar

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  10. EJB3.0开发环境的搭建

    EJB Container的介绍SUN公司正式推出了EJB的规范之后,在众多的公司和开发者中引起了非常大的反响.标志着用Java开发企业级应用系统将变的非常easy.很多公司都已经推出了或正打算EJB ...