Java23种设计模式
定义:一个对象发生改变,订阅他的对象也随着跟着改变,不需要在乎互相之间是如何改变的。
观察者模式分为:
- 多个观察一个,比方说课堂上老师讲课同时多个人可以听到。
- 一个观察多个,比方说考场上多个考生一个监考老师。
第一个例子:多个观察者对一个被观察者:
- 观察者为学生,学生的动作为听课:
//观察者
public interface Observer {
void listen(String msg);
}
- 被观察者为老师,老师的动作为讲课,并且观察者(学生)要注册登记到老师的名单内。
//被观察者
public interface Observable {
void add(Observer obs);
void teach(String msg);
}
- 创建教师对象,教师有固定的上课学生名单
public class Teacher implements Observable{
List<Observer> list = new ArrayList<>();
@Override
public void add(Observer obs) {
list.add(obs);
}
@Override
public void teach(String msg) {
for(Observer obs:list){
obs.listen(msg);
}
}
}
- 创建多个学生对象,学生接收老师教的知识并打印出来。
public class Xiaoming implements Observer{
@Override
public void listen(String msg) {
System.out.print("小明收到消息:"+msg);
}
}
public class XiaoLi implements Observer{
@Override
public void listen(String msg) {
System.out.print("小丽收到消息:"+msg);
}
}
public class Jack implements Observer{
@Override
public void listen(String msg) {
System.out.print("Jack收到消息:"+msg);
}
}
- 创建教室,配置教学环境
public class Study {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.add(new Xiaoming());
teacher.add(new Jack());
teacher.add(new XiaoLi());
teacher.teach("大家要好好学习天天向上!\n");
teacher.teach("告诉大家1+1=2\n");
}
}
- 查看学生学到的信息,看效果。
小明收到消息:大家要好好学习天天向上!
Jack收到消息:大家要好好学习天天向上!
小丽收到消息:大家要好好学习天天向上!
小明收到消息:告诉大家1+1=2
Jack收到消息:告诉大家1+1=2
小丽收到消息:告诉大家1+1=2
第二个例子:一个观察者对多个被观察者:
- 观察者为老师,老师只有一个动作,作弊记录下来。
//观察者
public interface Observer {
void whoZuobi(String name);
}
- 被观察者为学生,学生从入考场时候就有固定的监考老师,并且有可能有作弊的动作。
//被观察者
public abstract class Observable {
Observer observable;
void subscribe(Observer obs){
this.observable = obs;
}
abstract void zuobi();
}
- 创建老师实体类
public class Teacher implements Observer{
@Override
public void whoZuobi(String name) {
System.out.print(name+"作弊,记过一次!\n");
}
}
- 创建被观察者学生类
public class Xiaoming extends Observable{
@Override
void zuobi() {
observable.whoZuobi("小明");
}
}
public class XiaoLi extends Observable{
@Override
void zuobi() {
observable.whoZuobi("小丽");
}
}
public class Jack extends Observable{
@Override
void zuobi() {
observable.whoZuobi("Jack");
}
}
- 搭建考试环境
public class Examination {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Xiaoming xiaoming = new Xiaoming();
XiaoLi xiaoLi = new XiaoLi();
Jack jack = new Jack();
xiaoming.subscribe(teacher);
xiaoLi.subscribe(teacher);
jack.subscribe(teacher);
xiaoming.zuobi();
jack.zuobi();
xiaoming.zuobi();
xiaoming.zuobi();
xiaoming.zuobi();
}
}
- 运行结果:
小明作弊,记过一次!
Jack作弊,记过一次!
小明作弊,记过一次!
小明作弊,记过一次!
小明作弊,记过一次!
通过如上两个例子可以看出来,观察者模式必须保证的要素是:
- 最少一个观察者和一个被观察者
- 观察者需在被观察者处订阅
- 被观察者有发出通知的行为