介绍
属于行为型设计模式,它定义了一种一对多的的依赖共享,当一个对象的状态发生改变事,其所有依赖者都会收到通知并自动更新
举例
一个博主有多个粉丝,博主一发布消息,粉丝列表则会收到消息
博主/被观察者
import java.util.ArrayList;
import java.util.List;
/**
* 博主/被观察者
* @author aaa
*/
public class Blogger {
/**
* 博客内容
*/
private String message;
/**
* 粉丝列表
*/
private List<Fans> fansList=new ArrayList<>();
/**
* 添加粉丝
* @param fans
*/
public void addFans(Fans fans){
fansList.add(fans);
}
/**
* 删除指定粉丝
* @param fans
*/
public void removeFans(Fans fans){
fansList.remove(fans);
}
/**
* 发布消息并通知粉丝列表
* @param message
*/
public void publishMessage(String message){
this.message=message;
noticeFans();
}
/**
* 通知粉丝列表
*/
private void noticeFans(){
fansList.forEach(fans -> fans.receive(this.message));
}
}
粉丝接口/观察者
/**
* 粉丝接口/观察者
* @author aaa
*/
public interface Fans {
void receive(String message);
}
具体粉丝
/**
* 具体粉丝
* @author aaa
*/
public class FansImpl implements Fans{
/**
* 姓名
*/
private String name;
public FansImpl(String name){
this.name=name;
}
@Override
public void receive(String message) {
System.out.println(this.name + "收到:" + message);
}
}
测试
import org.junit.Test;
/**
*
* @author aaa
*/
public class ObserverPattern {
@Test
public void test(){
Blogger ikun = new Blogger();
Fans zhangSan=new FansImpl("张三");
Fans liSi=new FansImpl("李四");
ikun.addFans(zhangSan);
ikun.addFans(liSi);
ikun.publishMessage("ikun");
ikun.removeFans(zhangSan);
ikun.publishMessage("ikun1");
}
}
控制台打印
张三收到:ikun
李四收到:ikun
李四收到:ikun1