设计模式学习笔记(二)之观察者模式(Observer)

     上次学习了单例模式(点击进入:单例模式),今天趁空学习了一下观察者模式;

观察者模式定义了一种一对多的依赖关系, 让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。 

在观察者模式中,有抽象主题角色(Subject),具体主题角色(ConcreteSubject),抽象观察者角色(Observer),具体观察者角色(ConcreteObserver)

     ①:抽象主题角色(Subject)可以把所有观察者对象的应用保存在集合当中,一个主题可以有任意数量的观察者对象。抽象主题角色可以提供一个接口,里面有添加,删除角色的方法,还有一个通过观察者角色的方法;

     ②:具体主题角色(ConcreteSubject):当主题角色发生改变时候,会给所有已经注册过的观察者对象发送通知

     ③:抽象观察者角色(Observer):定义一个接口,在得到主题角色的通知的时候,可以自动的更新自己.

     ④:具体观察者角色(ConcreteObserver)这个角色去实现更新自己。

 看下观察者模式的类的UML图:

 

        ①: 创建一个Subject接口,里面有三个方法分别是addObserver,removeObserver,notifyObserver,

            创建一个Observer接口,里面有个更新自己的方法update();

        ②: 创建ConcreteSubject实现Subject接口,相应实现里面的方法,把观察者对象注册进来;当时主题角色发生状态改变的时候,去调用notifyObserver()方法来给已经注册的观察者进行通知,然后观察者来自己更新自己.

        ③:创建ConcreterObserver实现Observer接口,当观察者接受到主题角色发的通知,自己调用update()更新自己.


        接下来我们自己来模拟一个观察者模式(Observer)[其中涉及到2个接口,2个实现类,还有1个测试类]

      1:Subject接口

package com.jiangqq.observer;

/**
 * 抽象主题角色
 * @author jiangqq
 *
 */
public interface Subject {
	/**
	 * 注册添加观察者
	 * @param observer
	 */
      public void addObserver(Observer observer);
      /**
       * 刪除观察者
       * @param observer
       */
      public void removeObserver(Observer observer);
      /**
       * 对已经注册的观察者对象发送通知
       * @param observer
       */
      public void notifyObserver(String str);
}
      2:具体主题角色ConcreteSubject

package com.jiangqq.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体主题角色 :主要功能是添加,删除观察者,并且当主题角色内部状态发生改变的时候,来通知观察者
 * @author jiangqq
 *
 */
public class ConcreteSubject implements Subject {
    List<Observer> list=new ArrayList<Observer>();
   
	@Override
	public void addObserver(Observer observer) {
		list.add(observer);

	}

	@Override
	public void removeObserver(Observer observer) {
		list.remove(observer);

	}

	@Override
	public void notifyObserver(String str) {
	    for(Observer  observer:list)
	    {
	    	observer.update(str);
	    }

	}

}
       3:抽象观察者角色(Observer)
  
package com.jiangqq.observer;

/**
 * 抽象观察者角色
 * @author jiangqq
 *
 */
public interface Observer {
	/**
	 * 当观察者接受到主题发来的通知,自动调用update()来更新自己
	 */
   public void update(String str);
}
        4:具体观察者角色(ConcreteObserver)

package com.jiangqq.observer;

public class ConcreteObserver implements Observer {

	@Override
	public void update(String str) {
	   System.out.println("收到的信息是:"+str);
	}
}
          5:测试类

package com.jiangqq.test;

import com.jiangqq.observer.ConcreteObserver;
import com.jiangqq.observer.ConcreteSubject;
import com.jiangqq.observer.Observer;
import com.jiangqq.observer.Subject;

public class TestCustomObserver {
        public static void main(String[] args) {
			Subject sub=new ConcreteSubject();
		
			Observer ob1=new ConcreteObserver();
			Observer ob2=new ConcreteObserver();
			Observer ob3=new ConcreteObserver();
			//注册三个观察者,模拟当主题角色发送通知,三个观察者更新自己
			sub.addObserver(ob1);
			sub.addObserver(ob2);
			sub.addObserver(ob3);
			
			sub.notifyObserver("今天天氣很好...");
			//移除一個观察者
			sub.removeObserver(ob1);
			sub.notifyObserver("今天天氣不好...");
			
		}
}

    运行结果:

  

 

 

         

 

    源代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4091471



  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值