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/天,具体规则查看活动详情