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