JAVA设计模式之 观察者模式【Observer Pattern】

一、概念:

       简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

       观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。

       主要参与角色:观察者(Observer)与  被观察者(Observable)


二、代码DEMO:

            1、观察者接口类:Observer.java

package com.ice.patterns.observer;
/**
 * 设计模式之 观察者模式学习<br>
 * 定义观察者 通用接口
 * @author ice
 *
 */
public interface Observer {

	/**
	 * 一发现别人<被观察者>有动静,自己也要行动起来
	 * @param content
	 */
	public void update(String content);
}

          2、被观察者接口类:Observable.java

package com.ice.patterns.observer;
/**
 * 设计模式之 观察者模式学习<br>
 * 定义被观察者   通用接口
 * @author ice
 *
 */
public interface Observable {

	/**
	 * 增加/注册一个观察者
	 * @param observer
	 */
	public void addObserver(Observer observer);
	
	/**
	 * 当被观察者不想被某某暗暗偷窥啦、便可删除/注销该观察者
	 * @param observer
	 */
	public void removeObserver(Observer observer);
	
	/**
	 * 通知观察者   我干了什么事  也就是我干了什么事都让观察者知道
	 * @param content
	 */
	public void notifyObservers(String content);
	
	
}

           3、定义一个被观察者类:Xiaolv.java

package com.ice.patterns.observer;

import java.util.ArrayList;

/**
 * 这里小吕把自己定义成  被观察者<br>
 * 会被哪些人观察呢?呵呵... 女朋友?老爸?...
 * @author ice
 *
 */
public class Xiaolv implements Observable {

	/** 存储所有添加的 观察者  */
	private ArrayList<Observer> observerList = new ArrayList<Observer>();
	
	/**
	 * 添加观察者
	 */
	@Override
	public void addObserver(Observer observer) {
		this.observerList.add(observer);
	}

	/**
	 * 删除观察者
	 */
	@Override
	public void removeObserver(Observer observer) {
		this.observerList.remove(observer);
	}

	/**
	 * 通知所有的观察者
	 */
	@Override
	public void notifyObservers(String content) {
		for(Observer observer : observerList){
			observer.update(content);
		}
	}

	/**
	 * 小吕<一个被观察者>在开心的玩游戏
	 */
	public void playGameHappy(){
		System.out.println("小吕: 正在开心的玩游戏");
		notifyObservers("小吕 正在玩游戏");
	}
	
	/**
	 * 小吕<一个被观察者>在努力的写代码
	 */
	public void hardCoding(){
		System.out.println("小吕:正在努力的写代码");
		notifyObservers("小吕 正在写代码");
	}
}


           4、定义二个观察者类:GirlFriend.java

package com.ice.patterns.observer;
/**
 * 定义一个观察者类:小吕的女朋友
 * @author ice
 *
 */
public class GirlFriend implements Observer {

	@Override
	public void update(String content) {
		System.out.println("小吕的女朋友观察到:"+content);
	}

}
        

             MyFather.java

package com.ice.patterns.observer;
/**
 * 定义小吕的又一观察者类:我的老爸
 * @author ice
 *
 */
public class MyFather implements Observer {

	@Override
	public void update(String content) {
		System.out.println("小吕的老爸观察到:"+content);
	}
}

            5、客户端测试类 Client.java

package com.ice.patterns.observer;

public class Client {

	public static void main(String[] args) {
		/** 定义两个观察者对象:小吕的女朋友和老爸  */
		GirlFriend janice = new GirlFriend();
		MyFather myDad = new MyFather();
		/** 定义被观察者对象:小吕<ice> */
		Xiaolv ice = new Xiaolv();
		/** 添加janice去观察小吕  */
		ice.addObserver(janice);
		/** 添加老爸来观察小吕  */
		ice.addObserver(myDad);
		
		ice.playGameHappy();
		System.out.println("-------------");
		ice.hardCoding();
	}

}

       6、程序运行效果如下:

小吕: 正在开心的玩游戏
小吕的女朋友观察到:小吕 正在玩游戏
小吕的老爸观察到:小吕 正在玩游戏
-------------
小吕:正在努力的写代码
小吕的女朋友观察到:小吕 正在写代码
小吕的老爸观察到:小吕 正在写代码




    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的观察者设计模式是一种一对多的依赖关系,其中目标对象维护一组观察者对象,当目标对象的状态发生变化时,它会自动通知并更新所有的观察者对象。这种模式可以使目标对象与观察者对象之间解耦,使它们可以独立地进行修改和重用。 在Java中,观察者模式已经被封装成了两个接口:目标接口(Observable)和观察者接口(Observer)。目标接口(Observable)定义了添加、删除和通知观察者对象的方法,而观察者接口(Observer)定义了观察者对象接收更新通知的方法。 在实际应用中,我们可以通过实现观察者接口(Observer)来创建具体的观察者对象,并通过实现目标接口(Observable)来创建具体的目标对象。具体的观察者对象可以订阅目标对象的状态变化,并根据变化做出相应的响应。 在Java中,观察者模式被广泛应用于各个领域。在Android开发中,许多常见的组件和框架都使用了观察者模式,比如OnClickListener、ContentObserver,以及RxJava、RxAndroid和EventBus等通讯库。这些例子都是基于观察者模式的实现,通过观察者模式可以实现组件之间的解耦和灵活的消息传递。 总结来说,Java的观察者设计模式是一种实现目标和观察者对象之间解耦的设计模式,它可以提高代码的灵活性和可维护性。在实际应用中,我们可以使用Java提供的目标接口(Observable)和观察者接口(Observer)来实现观察者模式,并通过具体的观察者对象订阅目标对象的状态变化。这种设计模式在Android开发中也被广泛应用,并带来了许多便利的消息传递和通讯方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java设计模式观察者模式Observer Pattern)](https://blog.csdn.net/engineer_zh/article/details/78857166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java设计模式观察者模式](https://blog.csdn.net/m0_47944994/article/details/127903096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值