观察模式实现粉丝模仿明星说话
艺术圈 写道package cn.watchermodel;
/**
* 艺术圈 粉丝模仿明星说话
* @author 姚伟楠
*
*/
public class ArtCycle {
/**
* @param args
*/
public static void main(String[] args) {
Star star=new Star("谢霆锋");
for(int i=0;i<10;i++){
star.addWatcher(new Fan("粉丝"+i));
}
star.say("大家好,我是谢霆锋,我喜欢蔡依林");
}
}
?
粉丝类 写道package cn.watchermodel;/**
* 粉丝类
* @author 姚伟楠
*
*/
public class Fan extends Person implements Watcher {
public Fan(String name) {
super(name);
}
@Override
public void watcherPerform(String msg) {
say(msg);
}
@Override
protected void say(String msg) {
System.out.println(this.getName()+":"+msg);
}
}
?
人类 写道package cn.watchermodel;/**
* 人类 抽象
* @author 姚伟楠
*
*/
public abstract class Person {
private String name;
public Person(String name) {
this.name = name;
}
protected abstract void say(String msg);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
?
明星类 写道package cn.watchermodel;import java.util.ArrayList;
import java.util.List;
/**
* 明星类
* @author 姚伟楠
*
*/
public class Star extends Person implements Watched {
public Star(String name) {
super(name);
}
private List<Watcher> fans=new ArrayList<Watcher>();
private String favorate="";
@Override
public void addWatcher(Watcher watcher) {
if(null!=watcher){
fans.add(watcher);
}
}
/**
* 说出自己的爱好
*/
public void say(String msg){
favorate=msg;
notifyAllWatcher();
}
@Override
public void romoveWatcher(Watcher watcher) {
fans.remove(watcher);
}
@Override
public void notifyAllWatcher() {
for(Watcher watcher:fans){
watcher.watcherPerform(favorate);
}
}
}
?
被监视对象应有的接口 写道package cn.watchermodel;/**
* 被监视对象应有的接口
* @author 姚伟楠
*
*/
public interface Watched {
/**
* 添加监视者
*
* @param watcher
*/
public void addWatcher(Watcher watcher);
/**
* 移除监视者
* @param watcher
*/
public void romoveWatcher(Watcher watcher);
/**
* 通知监视者信息
*/
public void notifyAllWatcher();
}
?
监视着外接接口 写道package cn.watchermodel;/**
* 监视着外接接口
* @author 姚伟楠
*
*/
public interface Watcher {
/**
* 监听事件
* @param msg
*/
public void watcherPerform(String msg);
}
?