觀察者模式一般是用於消息的推廣發送。直白一點,就是一個發消息的,一羣接收消息的。
發消息的我們定爲Role,接收消息的我們定爲People。爲了更好的擴展,我們定義一個接口角色Roles,用於管理接受消息的人和發消息,Role實現這個接口
interface Roles{
void addPeople(People people);
void removePeople(People people);
void tellPeople(List<People> peopleList);
}
一個發消息的機構繼承Roles
class Role implements Roles{
List<People> peopleList = new ArrayList<>();
public String msg;
public void setMsg(String msg){
this.msg = msg;
tellPeople(peopleList);
}
@Override
public void addPeople(People people) {
peopleList.add(people);
}
@Override
public void removePeople(People people) {
int index = peopleList.indexOf(people);
if(index>0)
peopleList.remove(index);
}
@Override
public void tellPeople(List<People> peopleList) {
for (People peo:peopleList) {
peo.listen(msg);
}
}
}
這裏實現了添加接收消息的人,刪除接收消息的人,發送消息給所有人(tellPeople);
一個機構發消息,一定要傳遞消息或者其他信息到接收消息的人那裏。而這個消息就是msg,這裏暫定爲String格式。
一個機構一般會有一個讓接收消息的人實現的接口,也就是“聽到”消息。
interface Listen{
void listen(String msg);
}
想要收到這個消息,就要實現這個方法,如果用戶爲People:
class People implements Listen{
public String msg;
public People(Roles role){
role.addPeople(this);
}
@Override
public void listen(String msg) {
System.out.println("消息消費了:"+msg);
}
}
接收消息的人肯定要有一個消息的格式Sring msg ;然後把自己加到發消息的機構Role中的List中,這樣就可以接受到消息了。
其實,Roles中的list最好也修改爲List<Listen>,這樣更容易擴展下。下面是修改後的代碼:
public class TellModel {
public static void main(String[] args) {
Role role = new Role();
People people = new People(role);
role.setMsg("消息消費了哦!");
}
interface Roles{
void addPeople(People people);
void removePeople(People people);
void tellPeople(List<Listen> listenList);
}
static class Role implements Roles{
List<Listen> ltList = new ArrayList<>();
public String msg;
public void setMsg(String msg){
this.msg = msg;
tellPeople(ltList);
}
@Override
public void addPeople(People people) {
ltList.add(people);
}
@Override
public void removePeople(People people) {
int index = ltList.indexOf(people);
if(index>0)
ltList.remove(index);
}
@Override
public void tellPeople(List<Listen> listenList) {
for (Listen lis:ltList) {
lis.listen(msg);
}
}
}
interface Listen{
void listen(String msg);
}
static class People implements Listen{
public String msg;
public People(Roles roles){
roles.addPeople(this);
}
@Override
public void listen(String msg) {
System.out.println("消息消費了:"+msg);
}
}
}
如果感覺有點暈,就把接口全部去掉直接一對一,一個機構發給一羣特定的人,稍稍修改一下,更容易接受哦~