假定QQ可以在多个不同的客户端同时登陆(如:电脑,手机,pad,网页),当好友给我发消息时每个客户端都会接受到消息,基于这种业务使用观察者模式
定义观察者对象
/**
* 观察者接口
*/
public interface QQObServer {
public void sendMsg(String name);
}
添加三个客户端,手机,网页,电脑并实现QQObServer接口
public class MobileQQ implements QQObServer{
@Override
public void sendMsg(String name) {
System.out.println(name + " 发消息到手机QQ");
}
}
public class PCQQ implements QQObServer{
@Override
public void sendMsg(String name) {
System.out.println(name + " 发消息到电脑QQ");
}
}
public class WebQQ implements QQObServer{
@Override
public void sendMsg(String name) {
System.out.println(name + " 发消息到网页QQ");
}
}
再来一个抽象类AbstractQQ
public abstract class AbstractQQ {
//所有客户端集合
ArrayList<QQObServer> allClient = new ArrayList<QQObServer>();
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//添加客户端
public void addClient(QQObServer stockObServer){
allClient.add(stockObServer);
}
//删除客户端
public void delClient(QQObServer stockObServer){
allClient.remove(stockObServer);
}
//好友发消息,通知所有客户端
public void sendMsg(){
for(int i=0;i<allClient.size();i++){
QQObServer s = allClient.get(i);
s.sendMsg(name);
}
}
}
创建QQ类继承AbstractQQ
public class QQ extends AbstractQQ{
public void sendMsg(){
setName("大橙子");
super.sendMsg();
}
}
测试类
public class Test {
public static void main(String[] args) {
QQ qq = new QQ();
qq.addClient(new PCQQ());
qq.addClient(new MobileQQ());
qq.addClient(new WebQQ());
qq.sendMsg();
}
}
控制台输出
大橙子 发消息到电脑QQ
大橙子 发消息到手机QQ
大橙子 发消息到网页QQ
如果以后再添加pad客户端只需要新建一个Pad类,然后在Test类中添加代码qq.addClient(new Pad());就能给pad发送消息了
还有一种方法是使用JDK的Observable类实现观察者模式
新建QQ类继承Observable类
public class QQ extends Observable{
public void sendMsg(String name){
setChanged();
notifyObservers(name);
}
}
三个客户端实现Observer接口的update方法
public class WebQQ implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + " 发消息到网页QQ" );
}
}
public class MobileQQ implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + " 发消息到手机QQ" );
}
}
public class PCQQ implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + " 发消息到电脑QQ" );
}
}
测试类
public class Test {
public static void main(String[] args) {
QQ qq = new QQ();
MobileQQ 手机QQ = new MobileQQ();
PCQQ 电脑QQ = new PCQQ();
WebQQ 网页QQ = new WebQQ();
qq.addObserver(手机QQ);
qq.addObserver(电脑QQ);
qq.addObserver(网页QQ);
// qq.deleteObserver(网页QQ); //删除客户端
qq.sendMsg("大橙子");
}
}
控制台输出
大橙子 发消息到网页QQ
大橙子 发消息到电脑QQ
大橙子 发消息到手机QQ