您的位置:首页 > 编程语言 > Java开发

Java观察者模式

2014-12-22 11:28 190 查看
假定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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: