设计模式学习-观察者模式

观察者模式是一种多对一的关系,即多个观察者对象   观察  一个被观察者对象,当被观察者对象状态发生变化时,能自动通知观察者对象执行相应动作。

观察者模式提供给关联对象的一种同步通信的方式,下面来看结构图(截自 程杰 大化设计模式)

两个角色:

Subject:被观察者,一般为一个抽象类或接口,其中有一个聚集保存所有注册的观察者,一个方法用于通知所有的观察者,Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。

Observer: 观察者,抽象类或接口,有一个更新接口,更新自己的状态。

Java的Util中已实现这两个工具, Suject 为 java.util.Observable,查看jdk手册可知主要方法,其中要注意的是 setChanged() 方法,在通知之前必须调用该方法确认状态改变,否则通知不生效。

Observer接口:就一个update()方法。

以下来看例子:被观察者为博主,观察者为粉丝

1、文章类 Article

package com.zewe.observer;
/**
 * 文章类
 * @author ZeWe
 *
 */
public class Article {
	
	private String title;
	
	private String content;

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	public String show(){
		return "标题:"+title+" , 内容:"+content;
	}

}

2、博主类:BlogUser

package com.zewe.observer;

import java.util.Observable;
/**
 * 博主
 * @author ZeWe
 *
 */
public class BlogUser extends Observable{
	
	private String name;

	public BlogUser(String name) {
		super();
		this.name = name;
	}
	public void publicBlog(String title, String content){
		Article art = new Article();
		art.setTitle(title);
		art.setContent(content);
		System.out.println(name +"发表文章, "+art.show());
		this.setChanged(); // 发表文章动作确认
		this.notifyObservers(art); // 通知所有观察者
	}

}

3、粉丝类:Fans

package com.zewe.observer;

import java.util.Observable;
import java.util.Observer;
/**
 * 粉丝
 * @author ZeWe
 *
 */
public class Fans implements Observer{
	
	private String name;
	
	public Fans(String name) {
		super();
		this.name = name;
	}

	@Override
	public void update(Observable o, Object arg) {
		Article art = (Article) arg;
		System.out.println("粉丝"+name+"接收通知:"+art.show());
	}

}

4、执行方法

package com.zewe.observer;

public class MainTest {
	
	public static void main(String[] args) {
		
		BlogUser zewe = new BlogUser("ZeWe");
		
		Fans xiaoming = new Fans("小明");
		Fans tiezhu = new Fans("铁柱");
		
		//粉丝关注
		zewe.addObserver(xiaoming);
		zewe.addObserver(tiezhu);
		
		zewe.publicBlog("观察者模式", "设计模式学习观察者模式 ......");
		
	}

}




// 结果:
/**
ZeWe发表文章, 标题:观察者模式 , 内容:设计模式学习观察者模式 ......
粉丝铁柱接收通知:标题:观察者模式 , 内容:设计模式学习观察者模式 ......
粉丝小明接收通知:标题:观察者模式 , 内容:设计模式学习观察者模式 ......
**/
发布了73 篇原创文章 · 获赞 78 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/SHIYUN123zw/article/details/87894122
今日推荐