【Java设计模式】观察者模式

【Java设计模式】观察者模式,第1张

文章目录
    • 观察者模式角色
    • 观察者类图
    • 观察者模式例子
    • 观察者模式的优点
    • 观察者模式的适用情景

***观察者模式:***定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式角色

主题(Subject)
观察者(Observer)
具体主题(ConcreteSubject)
具体观察者(ConcreteObserver)

观察者类图

观察者模式例子

实例:
某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来,这样求职中心就会及时通知它最新的职业信息需求。

1.观察者

package observer;

public interface Observer {
	public void hearTelephones(String heardMess);

}

2.具体观察者
haigui.java

package observer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class HaiGui implements Observer{

	Subject subject;//获取主题的主题对象
	File myFile;
	public HaiGui(Subject subject,String fileName) {
		// TODO Auto-generated constructor stub
		this.subject =subject;
		subject.addObserver(this);//注册
		myFile = new File(fileName);
	}
	//有新的职务信息收到 
	@Override
	public void hearTelephones(String heardMess) {
		// TODO Auto-generated method stub
		RandomAccessFile out;
		try {
			boolean boo =heardMess.contains("java程序员")||heardMess.contains("软件");
			if(boo){
			out = new RandomAccessFile(myFile, "rw");
			//随机存储文件的对象,rw可读可写
			out.seek(out.length());
			byte[] b =heardMess.getBytes(); //将收到的消息转换称字节数组
			out.write(b);
			System.out.println("我是一个海归");
			System.out.println("我向文件"+myFile.getName()+"写入如下内容");
			System.out.println(heardMess);
			}
			else {
				System.out.println("我是海归,这次的信息没有我感兴趣的");
			}
	} 
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
	}

}


UniverStudent.java

package observer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class UniverStudent implements Observer{

	Subject subject;//获取主题的主题对象
	File myFile;
	public UniverStudent(Subject subject,String fileName) {
		// TODO Auto-generated constructor stub
		this.subject =subject;
		subject.addObserver(this);//注册
		myFile = new File(fileName);
	}
	//有新的职务信息收到 
	@Override
	public void hearTelephones(String heardMess) {
		// TODO Auto-generated method stub
		RandomAccessFile out;
		try {
			out = new RandomAccessFile(myFile, "rw");
			//随机存储文件的对象,rw可读可写
			out.seek(out.length());
			byte[] b =heardMess.getBytes(); //将收到的消息转换称字节数组
			out.write(b);
			System.out.println("我是一个大学生");
			System.out.println("我向文件"+myFile.getName()+"写入如下内容");
			System.out.println(heardMess);
	} 
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
	}

}

3.主题

package observer;



public interface Subject {
	public void addObserver(Observer o);
	public void deleteObserver(Observer o);
	public void notifyObservers();
}

4.具体主题

package observer;

import java.util.ArrayList;

public class SeekJobCenter implements Subject{
	String mess;
	boolean changed;
	ArrayList<Observer> personList;
	public SeekJobCenter() {
		// TODO Auto-generated constructor stub
		personList = new ArrayList<Observer>();
		mess="";
		changed =false;
	}
	@Override
	public void addObserver(Observer o) {
		// TODO Auto-generated method stub
		if(!personList.contains(o))
			personList.add(o);
		
	}
	@Override
	public void deleteObserver(Observer o) {
		// TODO Auto-generated method stub
		if(!personList.contains(o))
			personList.remove(o);
		
	}
	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		if(changed){
			for(int i=0;i<personList.size();i++){
				Observer observer = personList.get(i);
				observer.hearTelephones(mess);
			}
		}
		changed =false;
		
	}
	
	//获取新消息
	public void giveNewMess(String str){
		if(str.equals(mess))
			changed =false;
		else{
			mess =str;
			changed =true;
		}
	}

}

5.实现

public class Application {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SeekJobCenter center = new SeekJobCenter();
		UniverStudent stu1 =new UniverStudent(center, "student.txt");
		HaiGui hg1 = new HaiGui(center, "haigui.txt");
		center.giveNewMess("华为公司需要10个Java工程师");
		center.notifyObservers();
		center.giveNewMess("腾讯公司需要20个软件工程师");
		center.notifyObservers();
		center.giveNewMess("阿里巴巴公司需要10个java程序员");
		center.notifyObservers();
		center.giveNewMess("京东公司需要30个快递员");
		center.notifyObservers();

	}

}

6.运行

拉模型:

观察者模式的优点
  • 具体主题和具体观察者是松耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口,因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例,但不需要知道具体是哪个类。同样,由于观察者仅仅依赖于主题(Subject)接口,因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例,但不需要知道具体是哪个类。
  • 观察模式满足“开-闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口,因此如果增加新的实现观察者(Observer)接口的类,不必修改创建具体主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题(Observer)接口,如果增加新的实现主题(Subject)接口的类,也不必修改创建具体观察者类的代码。
观察者模式的适用情景

1、当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合。
2、当一个对象的数据更新时,这个对象需要让其他对象也各自更新自己的数据,但这个对象不知道具体有多少对象需要更新数据。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存