本文所有案例代码
码云:https://gitee.com/helloworld6379/designPattern
Github:Github地址
设计模式概述
1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通
用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的
一段时间的试验和错误总结出来的。
2 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。
3 设计模式并不局限于某种语言,java,php,c++ 都有设计模式.
设计模式类型
设计模式分为三种类型,共 23 种
1 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
2 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。
简单介绍
学完之后,感觉观察者模式中的目标对象就类似于自然界的哨兵。
当哨兵发现敌情,发出信号,其他的动物(也就是观察者)就会做出反应。
下面这一段来自菜鸟教程:
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
实现
中央气象台更改天气信息的时候,订阅它服务的天气App就要做出相应修改。
UML图:
/**
* @Description 观察者接口
* @Author: LiuXing
* @Date: 2020/5/26 23:25
*/
public interface Observer {
public void update(float temperature,float pressure,float humidity);
}
/**
* @Description 墨迹天气App
* @Author LiuXing
* @Date 2020/06/11 23:07
*/
public class MojiWeather implements Observer {
// 温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
//更新天气情况
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
// 显示
public void display() {
System.out.println("===墨迹天气App====");
System.out.println("***气温 : " + this.temperature + "***");
System.out.println("***气压: " + this.pressure + "***");
System.out.println("***湿度: " + this.humidity + "***");
}
}
/**
* @Description 彩云天气App
* @Author: LiuXing
* @Date: 2020/6/11 23:14
*/
public class CaiYunWeather implements Observer {
// 温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
//更新天气 由WeatherData调用
@Override
public void update(float temperature, float pressure, float humidity) {
this.humidity = humidity;
this.pressure = pressure;
this.temperature = temperature;
show();
}
//显示
public void show() {
System.out.println("===彩云天气App====");
System.out.println("***气温 : " + this.temperature + "***");
System.out.println("***气压: " + this.pressure + "***");
System.out.println("***湿度: " + this.humidity + "***");
}
}
/**
* @Description 接口, 让WeatherData 来实现
* @Author: LiuXing
* @Date: 2020/6/11 22:57
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
package com.struggle.pattern.observer;
import java.util.ArrayList;
/**
* @Description 中央气象台
* @Author: LiuXing
* @Date: 2020/6/11 23:07
*/
public class WeatherData implements Subject {
private float temperatrue;
private float pressure;
private float humidity;
//观察者集合
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<>();
}
public void setWeatherData(float temperatruem, float pressure, float humidity) {
this.temperatrue = temperatruem;
this.pressure = pressure;
this.humidity = humidity;
//将最新的信息 推送给 接入方currentConditions
notifyObserver();
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if (this.observers.contains(observer)) {
this.observers.remove(observer);
}
}
@Override
public void notifyObserver() {
for (int i = 0; i < this.observers.size(); i++) {
this.observers.get(i).update(this.temperatrue, this.pressure, this.humidity);
}
}
}
/**
* @Description 观察者模式测试
* @Author LiuXing
* @Date 2020/06/11 23:09
*/
public class ObserverTest {
public static void main(String[] args) {
//创建中央气象台
WeatherData weatherData = new WeatherData();
//创建观察者
CaiYunWeather caiYunWeather = new CaiYunWeather();
MojiWeather mojiWeather = new MojiWeather();
//注册到中央气象台
weatherData.registerObserver(caiYunWeather);
weatherData.registerObserver(mojiWeather);
System.out.println("通知各个注册的观察者, 看看信息");
weatherData.setWeatherData(10f, 100f, 30.3f);
System.out.println("去掉一个观察者再测试:");
weatherData.removeObserver(caiYunWeather);
System.out.println("通知各个注册的观察者, 看看信息");
weatherData.setWeatherData(32f, 160f, 31.5f);
}
}
通知各个注册的观察者, 看看信息
===彩云天气App====
***气温 : 10.0***
***气压: 100.0***
***湿度: 30.3***
===墨迹天气App====
***气温 : 10.0***
***气压: 100.0***
***湿度: 30.3***
去掉一个观察者再测试:
通知各个注册的观察者, 看看信息
===墨迹天气App====
***气温 : 32.0***
***气压: 160.0***
***湿度: 31.5***
观察者模式在 Jdk 中的应用
Jdk 的 Observable 类就使用了观察者模式
只不过Observable是类,不是接口,类中已经实现了核心的方法 ,即管理 Observer的add、delete、notify等方法。
Observer跟文中的Observer一样。