java 23种设计模式之观察者模式
前言介绍:
- 设计模式简介:总共有23种设计模式(分为三大类:创建型、结构型、行为型)模式
- 创建型(5种):单列模式、抽象工厂模式、建造者模式、工厂方法模式、原型模式
- 结构型(7种):适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式
- 行为型(11种):模板方法模式、命令模式、迭代子模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、 策略模式、职责链模式(责任链模式)、访问者模式。
- 除了以上23种设计模式之外其实还有两大类:并发型模式和线程池模式。
此博文仅介绍 观察者模式。
1.写一个观察者类
package com.jidongcloud.observer;
public class Observer {
/**
* 观察者模式介绍实现思想
* 学生刚开始需要一个认真学习的状态
* 当学生认真学习的状态改变,在上课吃辣条时
* 老师观察到这个变化,就会请家长
* 学生需要一个状态改变的方法,一个添加观察者老师的方法,还要有一个通知观察者自己状态改变的方法,并且再状态改变后立即让观察者老师 叫家长
*/
String name;
Observer(){}
@Override
public String toString() {
return "Observer{" +
"name='" + name + '\'' +
'}';
}
//构造方法初始化
public Observer(String name) {
this.name = name;
}
//观察者成员方法
public void look(String name,String state){
System.out.println("我是"+this.name +",因为"+name+"在"+state+",我要叫家长!");
}
}
2.写一个学生类
package com.jidongcloud.observer;
import java.util.*;
/**
* ClassName:Student
* PackageName:com.jidongcloud.observer
* Description:
*
* @date:2020/4/22 11:23
* @author:13812536906
*/
public class Student {
String name;
String state;
List<Observer> observerList ;
public Student(){}
public Student(String name) {
this.name = name;
this.state="学习";
this.observerList=new ArrayList<Observer>();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
//只要状态发生变化,通知观察者,数据改变了
this.tell();
}
public void attach(Observer observer){
this.observerList.add(observer);
}
//通知方法
public void tell() {
for (Observer observer : observerList) {
observer.look(this.name,this.state);
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", state='" + state + '\'' +
", observerList=" + observerList +
'}';
}
}
3.写一个测试类
package com.jidongcloud.observer;
/**
* ClassName:Test
* PackageName:com.jidongcloud.observer
* Description:
*
* @date:2020/4/22 14:15
* @author:13812536906
*/
public class Test {
public static void main(String[] args) {
//创建2个观察者对象
Observer observer=new Observer("班主任");
Observer observer2=new Observer("教导主任");
//创建被观察对象
// Student s=new Student("小明");
Student s=new Student("小花");
//被观察对象添加观察对象
s.attach(observer);
s.attach(observer2);
//先获取最开始的状态
System.out.println(s.name+"之前在"+s.getState());
//状态改变
// s.setState("上课吃炸鸡");
s.setState("喝饮料");
System.out.println(s.name+"目前在"+s.getState());
}
}
以下是控制台输出结果