技术标签: Java2018
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
观察者模式的关键对象是主题Subject和观察者Observer.一个Subject可以有任意数目依赖它的Observer,
一旦Subject的状态发生了改变,所有的Observer都可以得到通知.Subject发出通知的时候并不需要知道谁是它的Observer.
而且任何具体的观察者也不知道其他观察者是什么
观察者模式的使用场景
当一个对象的改变需要同时改变其他对象,并且不需要知道具体多少需要改变
Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.
抽象主题提供一个接口,可以增加和删除观察者对象.
Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫做更新接口.抽象观察者一般用一个抽象类或者一个接口实现.
更新接口通常包含一个Update()方法,这个方法叫做更新方法.
ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知.
具体主题角色通常用一个具体子类实现
public static void main(String[] args) {
SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
//创建微信用户
WeixinUser user1=new WeixinUser("a");
WeixinUser user2=new WeixinUser("b");
WeixinUser user3=new WeixinUser("c");
//订阅公众号
mSubscriptionSubject.add(user1);
mSubscriptionSubject.add(user2);
mSubscriptionSubject.add(user3);
mSubscriptionSubject.notify("d的专栏更新了");
}
/**
* 微信用户是观察者,微信公众号是被观察者,有多个的微信用户关注了一个公众号
* 当这个公众号更新时就会通知这些订阅的微信用户
*抽象观察类
* @author guk
*
*/
public interface Observer {
public void update(String message);
}
/**
* 具体观察者 ConcreteObserver
* @author guk
*
*/
public class WeixinUser implements Observer {
//微信用户名
private String name;
public WeixinUser(String name) {
super();
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name+"-"+message);
}
}
/**
* 抽象被观察者类Subject
* @author guk
*
*/
public interface Subject {
/**
* 增加订阅者
* @param observer
*/
void add(Observer observer);
/**
* 删除订阅者
* @param observer
*/
void delete(Observer observer);
/**
* 通知订阅者更新消息
* @param message
*/
void notify(String message);
}
/**
* 具体被观察者(ConcreteSubject)
* @author guk
*
*/
public class SubscriptionSubject implements Subject {
//储存订阅公众号的微信用户
private List<Observer> weixinUserList=new ArrayList<Observer>();
@Override
public void add(Observer observer) {
weixinUserList.add(observer);
}
@Override
public void delete(Observer observer) {
weixinUserList.remove(observer);
}
@Override
public void notify(String message) {
for(Observer observer:weixinUserList) {
observer.update(message);
}
}
}
目录1.继承1). 继承的优势2). Java中继承的特点3). 继承子类中关键字4). 继承中子类、父类成员(变量/方法)的特点5). 子类重写 (覆盖) 父类中方法(1). 何时重写(2). 重写条件(3). 重写、重载区别2.子类对象的实例化过程1). 子类能否覆盖父类的构造方法2). 隐式super语句和显式super语句3). 使用super语句的注意事项4). 总结super语句3.子类this的真实指向1). 子类对象实例化过
序本文主要介绍下jdbc的socket timeout的设置jdbc timeout类别主要有如下几个类别transaction timeout设置的是一个事务的执行时间,里头可能包含多个statementstatement timeout(也相当于result set fetch timeout)设置的是一个statement的执行超时时间,即driver等待statement执行完成,接收到数...
sass变量使用 vue中全局引用sass变量 sass-resources-loader webpack配置
Qt 进行url编/解码时要注意的一些问题。
前言最近一直在想着能否有一种更好的方案来解决:Android中Activity与Fragment之间通信的问题,什么叫更好呢,就是能让Fragment的复用性高,性能还有好(不用反射),代码还要好维护,不需要为每对Activity和Fragment之间定义接口而发愁。先简单说下Javascript这门语言吧,或许有人就会问:咱们不是聊Android的java问题吗?怎么话题转到JavaScript...
Qt的Tcp服务器多线程编程-附带代码展示该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程。创建子线程时需要注意的点:1、子线程与主线程之间交互数据时,应采用信号槽的方式2、子线程中实例化的对象,不应出现在其他线程当中3、子线程需加入QThread::exec()事件循环函数4、子线程的销毁关联窗口的销毁信号,调用exit()、quit()、deleteLater()期间所遇到的问题:1、之前的思路是想在子线程当中去监听客户端的连接以及数据处理
国内最好用的则是新浪的T.CN短网址,使用用的人非常多,不进稳定,而且访问的速度也是非常的快的.今天就给大家推荐几家可以在线生成新浪T.CN短链接的的工具!1.冷狗短链接地址:http://dogdwz.cn/冷狗短链接那边提供最新的新浪T.CN短网址在线压缩器,每天都可以去免费生成新的短链接,他们采用的是T.CN官方的原生态生成APP KEY,生成了之后是可以永久使用的。2.麦云短链接...
1,apache的安装详细的不说,傻瓜安装法./configue --prefix=dir/apache2 --enable-so(./configure --prefix=/opt/apache --enable-module=so)makemake install设置开机启动 vi /etc/rc.d/rc/local 添加:/opt/apache/bin/apach
MAC地址格式详解以太网编址在数据链路层,数据帧通常依赖于MAC地址来进行数据交换,它如同公网IP地址一样要求具有全球唯一性,这样才可以识别每一台主机。那么MAC地址如何做到这点?它的格式又是什么?MAC地址,英文全称Medium Access Control,直译为介质访问控制,它通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC(硬件)地址长48位(6字节),采用十六进制格式,下图说明了48位的MAC地址及其组成部分。 ...
using AspectCore.DynamicProxy;using Microsoft.Extensions.DependencyInjection;using System;using System.Threading.Tasks;using AspectCore.Extensions.DependencyInjection;namespace AOP_Demo{ c...
本文结合自己的小站PHP10086博客网浅谈一下程序员的SEO策略指南 程序员个人网站特点 自己是技术出身,很少看重seo,或者不知道怎么seo自己的网站 没有时间发什么水帖之类的宣传自己的网站 也没有研究过seo,尤其是个人博客性质的小站 程序员网站:更多的是把网站作为个人交流的平台,而没有把他作为盈利工具,很少关注seo 结合自己浅谈一下程序员seo之道...
/** * @brief GetString0x16 byte数组转string(16进制格式) * @param bArray 数组 * @param bArray_len 数组长度 * @param offset 偏移量 * @param size 待处理字节数 * @return 16进制形式字符串 */ ...