Java观察者模式

假定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






 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值