java 23种设计模式之行为型模式—观察者模式(15)

java 23种设计模式之行为型模式—观察者模式(15)

观察者模式(Observer)

顾名思义,就是多个观察者去监听或接收一个主题的模式


观察者模式分两个阶段,第一个阶段是主题,第二个阶段是观察者


比如,我们在银行的账户,通常不止一种接收信息的方式,比如手机,邮件等方式来接收,当账户信息发生变动时,包括接收终端的变动,就会像已注册的通信方式发送消息,或者这些方式可以自动监听。如账户信息变动、通信终端的变动

下面为就以这个例子来大概的介绍下观察者模式

首先定义通信终端==》接口

/*
 * 定义通信手段 
 */
public interface ICommunication {
	public void update(String message);
	public String getName();
}
update方法是获得更新信息


getame方法是获得通信终端的名字,如手机号码是多少,邮箱号码是多少等。

然后通信终端的实现类

public class receivingMode implements ICommunication{

	private String receiveName;
	
	public receivingMode(String receiveName){
		this.receiveName = receiveName;
	}
	public void update(String message) {
		System.out.println(receiveName+" ==> "+message);
		
	}
	
	public String getName() {
		return this.receiveName;
		
	}

}


实现类很简单,构造方法用于获得通信终端的名字,就是手机号码、邮箱号码等

然后定义我们的银行==》接口

/*
 * 银行可以决定由那些方式来接收账户变动消息
 * 账户发生变化后可以向所有接收者发送信息
 */
public interface IBank {
	public void addCommunication(ICommunication com);
	public void removeCommunication(ICommunication com);
	public void notifyCommunication(String message);

}
addCommunication方法是添加通信终端


addCommunication方法是移出通信终端

notifyCommunication方法是通知信息


最后定义我们的银行实现类

public class Bank implements IBank{
	//存储终端
	private List<ICommunication> list = new ArrayList<ICommunication>();

	@Override
	public void addCommunication(ICommunication com) {
		
		for(ICommunication ic:list){
			ic.update("【广播】添加接收终端:"+com.getName());
		}
		System.out.println();
		
		list.add(com);
		
		com.update("【通知】已经添加接收信息成功");
		System.out.println();
		
	}

	@Override
	public void removeCommunication(ICommunication com) {
		for(ICommunication ic:list){
			ic.update("【广播】准备移出接收终端:"+com.getName());
		}
		System.out.println();
		list.remove(com);
		
		com.update("【通知】您已经成功解锁接收终端");
		System.out.println();
		
	}

	@Override
	public void notifyCommunication(String message) {
		
		//遍历list
		for(ICommunication ic:list){
			ic.update("【广播】"+message);
		}
		
	}

}
这个类实现了,不管是账户发送变动,还是通信终端的变动,所有的通信终端都会得到消息


最后是我们的测试类

public class demo {
	public static void main(String[] args) {
		
		//定义银行
		IBank bank = new Bank();
		
		//定义接收方式
		ICommunication mail = new receivingMode("邮件:www@qq.com");
		ICommunication phone = new receivingMode("手机:13567896789");
		
		//将定义的接收方式加入到银行
		bank.addCommunication(mail);
		bank.addCommunication(phone);
		
		//向所有的注册信息放松账户变动消息
		bank.notifyCommunication("账户已发生改变,请留意");
	}
}
打印结果如下
邮件:www@qq.com ==> 【通知】已经添加接收信息成功

邮件:www@qq.com ==> 【广播】添加接收终端:手机:13567896789

手机:13567896789 ==> 【通知】已经添加接收信息成功

邮件:www@qq.com ==> 【广播】账户已发生改变,请留意
手机:13567896789 ==> 【广播】账户已发生改变,请留意



爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img