java实现观察者模式

观察者模式(发布/订阅模式)提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察者的对象分离开。在该模式中,一个对象通过添加一个方法是的自身变得可观察。

例如,用户界面可以作为观察者,业务数据是被观察者,当数据有变化后会通知界面,界面收到通知后,会根据自己的显示方式修改界面。一个对象只做一件事情,并且将它做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

import java.util.ArrayList;
interface Subject{
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
	
}
class Whether implements Subject{
	private ArrayList<Observer>observers=new ArrayList<Observer>();
	private float temperature;
	@Override
	public void notifyObservers() {
		for(int i=0;i<this.observers.size();i++) {
			this.observers.get(i).update(temperature);
		}
	}
	@Override
	public void registerObserver(Observer o) {
		this.observers.add(o);
	}
	@Override
	public void removeObserver(Observer o) {
		this.observers.remove(o);
	}
	public void whetherChange() {
		this.notifyObservers();
	}
	public float getTemperature(){
		return temperature;
	}
	public void setTemperature(float temperature) {
		this.temperature=temperature;
		notifyObservers();
	}
}
interface Observer{
	//更新温度
	public void update(float temp);
}
class WhetherDisplay1 implements Observer{
	private float temprature;
	public WhetherDisplay1(Subject whether) {
		whether.registerObserver(this);
	}
	@Override
	public void update(float temp) {
		this.temprature=temp;
		display();
	}
	public void display() {
		System.out.println("display1:"+this.temprature);
	}
}
class WhetherDisplay2 implements Observer{
	private float temprature;
	public WhetherDisplay2(Subject whether) {
		whether.registerObserver(this);
	}
	@Override
	public void update(float temp) {
		this.temprature=temp;
		display();
	}
	public void display() {
		System.out.println("display2:"+this.temprature);
	}
}
public class HelloWorld{
	public static void main(String[] args) {
		Whether whether=new Whether();
		WhetherDisplay1 d1=new WhetherDisplay1(whether);
		WhetherDisplay2 d2=new WhetherDisplay2(whether);
		whether.setTemperature(27);
		whether.setTemperature(26);
	}
}

运行结果:

display1:27.0
display2:27.0
display1:26.0
display2:26.0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!
观察者模式是一种常见的设计模式,它的主要思想是在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在Java中,观察者模式实现需要定义两个角色:Subject(主题)和Observer(观察者)。Subject负责维护一组观察者对象,以及通知它们状态的变化;而Observer则负责接收Subject的通知,并做出相应的处理。 下面是一个简单的Java实现: ```java import java.util.ArrayList; import java.util.List; // 主题接口 interface Subject { void attach(Observer observer); // 添加观察者 void detach(Observer observer); // 移除观察者 void notifyObservers(); // 通知所有观察者 } // 观察者接口 interface Observer { void update(); // 更新状态 } // 具体主题类 class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } // 主题状态的变化 public void changeState() { // do something notifyObservers(); // 通知所有观察者 } } // 具体观察者类 class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } public void update() { System.out.println(name + " has received the update."); } } // 测试 public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("Observer1"); Observer observer2 = new ConcreteObserver("Observer2"); Observer observer3 = new ConcreteObserver("Observer3"); subject.attach(observer1); subject.attach(observer2); subject.attach(observer3); ((ConcreteSubject) subject).changeState(); subject.detach(observer2); ((ConcreteSubject) subject).changeState(); } } ``` 在这个例子中,我们定义了Subject和Observer两个接口,以及它们的具体实现类ConcreteSubject和ConcreteObserver。其中ConcreteSubject负责维护一组观察者对象,并在状态变化时通知它们;而ConcreteObserver则负责接收Subject的通知,并做出相应的处理。 在测试代码中,我们创建了一个ConcreteSubject对象,并向它添加了三个ConcreteObserver观察者。然后我们调用changeState()方法改变主题的状态,这会触发ConcreteSubject通知所有观察者。最后我们移除了一个观察者,并再次调用changeState()方法,这时只有两个观察者会收到通知。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值