观察者设计模式
在被观察者类中保存有一份观察者名单,在某些业务逻辑执行的时候,会调用观察者的通知接口
- 观察者接口
IObserver
package pattern.observer;
/**
* 观察者接口
*/
public interface IObserver {
void handleSome(String message);
}
2.观察者实现类ObserverFirst,ObserverSecond
package pattern.observer;
/**
* 第一个观察者
*/
public class ObserverFirst implements IObserver {
@Override
public void handleSome(String message) {
System.out.println(this.getClass().getSimpleName() + "正在处理【" + message + "】");
}
}
package pattern.observer;
/**
* 第二个观察者
*/
public class ObserverSecond implements IObserver {
@Override
public void handleSome(String message) {
System.out.println(this.getClass().getSimpleName() + "正在处理【" + message + "】");
}
}
- 被观察者接口
IObserverable
package pattern.observer;
import java.util.ArrayList;
/**
* 被观察者接口
*/
public interface IObserverable {
/**
* 添加观察者
*/
void addObserver(IObserver iObserver);
/**
* 删除观察者
*/
void removeObserver(IObserver iObserver);
/**
* doSome,被观察者观察的方法
*/
void doSome(String some);
/**
* 观察者列表
*/
ArrayList<IObserver> observerList();
}
- 被观察者实现类
Observerable
package pattern.observer;
import java.util.ArrayList;
public class Observerable implements IObserverable {
ArrayList<IObserver> observers;
public Observerable() {
observers = new ArrayList<>();
}
/**
* 添加观察者
*/
public void addObserver(IObserver iObserver) {
observers.add(iObserver);
}
/**
* 删除观察者
*/
public void removeObserver(IObserver iObserver) {
observers.remove(iObserver);
}
/**
* doSome,被观察者观察的方法
*/
public void doSome(String message) {
for (IObserver observer : observers) {
observer.handleSome(message);
}
}
/**
* 观察者列表
*/
public ArrayList<IObserver> observerList() {
return observers;
}
}
- 测试
package pattern.observer;
import org.apache.commons.lang.StringUtils;
class MainClass {
public static void main(String[] args) {
/**
* 观察者一号
*/
IObserver first = new ObserverFirst();
/**
* 观察者二号
*/
IObserver second = new ObserverSecond();
/**
* 被观察者
*/
IObserverable observerable = new Observerable();
/**
* 被观察者添加观察者
*/
observerable.addObserver(first);
observerable.addObserver(second);
/**
* 被观察者执行业务逻辑
*/
observerable.doSome("左转");
System.out.println(StringUtils.repeat("=", 30));
/**
* 从观察者列表中删除第一个观察者
*/
observerable.removeObserver(first);
observerable.doSome("直行");
}
}
结果;
ObserverFirst正在处理【左转】
ObserverSecond正在处理【左转】
==============================
ObserverSecond正在处理【直行】
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Python爬虫的两套解析方法和四种爬虫实现
对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式。因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门。本文想针对某一网页对python基础爬虫的两大解析库(BeautifulSoup和lxml)和几种信息提取实现方法进行分析,以开python爬虫之初见。 基础爬虫的固定模式 笔者这里所谈的基础爬虫,指的是不需要处理像异步加载、验证码、代理等高阶爬虫技术的爬虫方法。一般而言,基础爬虫的两大请求库urllib和requests中requests通常为大多数人所钟爱,当然urllib也功能齐全。两大解析库BeautifulSoup因其强大的HTML文档解析功能而备受青睐,另一款解析库lxml在搭配xpath表达式的基础上也效率提高。就基础爬虫来说,两大请求库和两大解析库的组合方式可以依个
-
下一篇
Web安全的三个攻防姿势
关于Web安全的问题,是一个老生常谈的问题,作为离用户最近的一层,我们大前端确实需要把手伸的更远一点。 我们最常见的Web安全攻击有以下几种: ●XSS 跨站脚本攻击 ●CSRF 跨站请求伪造 ●clickjacking 点击劫持/UI-覆盖攻击 下面我们来一一分析。 XSS 跨站脚本攻击 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 分类: 1. Reflected XSS(基于反射的XSS攻击) 2. Stored XSS(基于存储的XSS攻击) 3. DOM-based or local XSS(基于DOM或本地的XSS攻击) Reflected XSS(基于反射的XSS攻击) 主要通过利用系统反馈行为漏洞,并欺骗用户主动触发,从而发起Web攻击。 举个栗子: 1- 假设,在严选网站搜索商品,当搜索不到时站点...
相关文章
文章评论
共有0条评论来说两句吧...

微信收款码
支付宝收款码