package tech.selinux.design.pattern.behavioral.observer;
import java.util.Observable;
/** 公众号 */
public class OfficialAccounts extends Observable {
private String accountsName;
public OfficialAccounts(String accountsName) {
this.accountsName = accountsName;
}
public String getAccountsName() {
return accountsName;
}
// 代表状态发生改变
public void publishArticle(OfficialAccounts accounts, Article article) {
System.out.println(article.getTitle() + " on " + accounts.getAccountsName());
setChanged();
notifyObservers(article);
}
}
公众号内的文章是依附于公众号存在的。
package tech.selinux.design.pattern.behavioral.observer;
public class Article {
private String title;
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
接下来定义用户,用户是观察者,公众号是被观察者。
package tech.selinux.design.pattern.behavioral.observer;
import java.util.Observable;
import java.util.Observer;
/** 对于用户来说,观察的是公众号 观察者是 user,被观察者是 offical accounts */
public class User implements Observer {
private String nickName;
public User(String nickName) {
this.nickName = nickName;
}
@Override
public void update(Observable o, Object arg) {
OfficialAccounts accounts = (OfficialAccounts) o;
Article article = (Article) arg;
StringBuilder sb = new StringBuilder();
sb.append("用户名:")
.append(nickName)
.append(": \n")
.append("公众号 :")
.append(accounts.getAccountsName())
.append("\n")
.append("文章:")
.append(article.getTitle())
.append("\n");
System.out.println(sb.toString());
}
}
package tech.selinux.design.pattern.behavioral.observer;
public class Test {
public static void main(String[] args) {
OfficialAccounts accounts = new OfficialAccounts("Linux 中国");
User user = new User("PegasusMeteor");
accounts.addObserver(user);
User user1 = new User("Pegasus");
accounts.addObserver(user1);
Article article = new Article();
article.setTitle("Linux 未来趋势");
article.setContent("一片大好");
accounts.publishArticle(accounts, article);
}
}