绪论
其实很早以前就看过一些关于设计模式的文章,知道这个很重要,为此还写了一些demo,但是在实际开发过程中基本没有使用过。原因:不习惯,不记得,其实更多的是不明白什么情况下可以使用。所以导致自己的代码又臭又长,还会重复的造一些轮子,使代码看起来毫无亮点。
这次学习设计模式,更多的是分析理解,思考以往编程中哪些地方可以用到这些模式,从而可以使以后的自己在开发相同模块时可以使用。
理解
- 行为型模式。
- 基本概念:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- 优点:抽象耦合,触发机制。
- 缺点:如果观察者过多,全部通知会花费很多时间。若观察者和被观察者循环依赖,可能会导致系统崩溃
代码
Observer.java
public interface Observer {
// 目标发生改变时进行更新
void update(String phone);
}
Student.java
public class Student implements Observer {
private String name;
private String teacherPhone;
public Student(String name, Subject subject) {
this.name = name;
subject.attach(this);
}
@Override
public void update(String phone) {
this.teacherPhone = phone;
}
public void show() {
System.out.println("Name:" + name + "\nTeacher's phone:" + teacherPhone);
}
}
Subject.java
public interface Subject {
// 添加观察者
void attach(Observer observer);
// 删除观察表
void detach(Observer observer);
// 通知
void notice();
}
Teacher.java
import java.util.ArrayList;
import java.util.List;
public class Teacher implements Subject {
private List<Observer> students = null;
private String phone;
public Teacher() {
students = new ArrayList<>();
phone = "";
}
public void setPhone(String phone) {
this.phone = phone;
notice();
}
@Override
public void attach(Observer observer) {
students.add(observer);
}
@Override
public void detach(Observer observer) {
students.remove(observer);
}
@Override
public void notice() {
for (Observer server : students) {
server.update(this.phone);
}
}
}
Main.java
import java.util.Vector;
public class Main {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
Vector students = new Vector();
// 创建被观察者
Teacher t = new Teacher();
// 创建观察者
for (int i = 0; i < 5; i++) {
Student s = new Student("Tom_" + i, t);
students.add(s);
}
// 电话更新
t.setPhone("15612345678");
for (int i = 0; i < students.size(); i++) {
((Student)students.get(i)).show();
}
// 电话更新
t.setPhone("15687654321");
for (int i = 0; i < students.size(); i++) {
((Student)students.get(i)).show();
}
}
}
结果
老师电话变更,通知所有学生观察者。
(若有什么错误,请留言指正,3Q)