Java设计模式(八)观察者模式 迭代器模式
(十五)观察者模式
观察者模式,定义对象间一对多关系,一个对象状态发生改变,全部依赖于它的对象都收到通知而且自己主动更新,观察者与被观察者分开。比如邮件订阅、RSS订阅,假设有更新就会邮件通知你。
interface Observers{
public void update();
}
class Observer1 implements Observers{
public void update(){
System.out.println("observer1 has received");
}
}
class Observer2 implements Observers{
public void update(){
System.out.println("observer2 has received");
}
}
interface Subject {
public void add(Observers ob);
public void delete(Observers ob);
public void notifyObservers();
public void operation();
}
abstract class AbstractSubject implements Subject{
private Vector<Observers> vector = new Vector<>();
public void add(Observers ob){
vector.add(ob);
}
public void delete(Observers ob){
vector.remove(ob);
}
public void notifyObservers(){
Enumeration<Observers> enumo = vector.elements();
while(enumo.hasMoreElements()){
enumo.nextElement().update();
}
}
}
class MySubject extends AbstractSubject{
public void operation(){
System.out.println("update self");
notifyObservers();
}
}
public class Observer {
public static void main(String[] args){
Subject sub = new MySubject();
sub.add(new Observer1());
sub.add(new Observer2());
sub.operation();
}
}
(十六)迭代器模式
说到迭代器首先想到 Iterator ,使用迭代器来为顺序訪问集合元素提供一种方式。以下是自己的一个集合,当然仅仅能放 int ,简单的实现了 迭代器的功能,当然实际的Java迭代器比这要复杂非常多。
interface Collection{
public Iterator iterator();
public Object get(int i);
public int size();
public void add(int n);
}
interface Iterator{
public Object previous();
public Object next();
public boolean hasNext();
public Object first();
}
class MyCollection implements Collection{
private int count = 10;
private int[] num = new int[count];
public void add(int n){
for(int i = 0;i < num.length;i++){
if(num[i] == 0){
num[i] = n;
return;
}
}
}
public MyCollection(int count){
this.count = count;
}
@Override
public Iterator iterator() {
return new MyIterator(this);
}
@Override
public Object get(int i) {
return num[i];
}
@Override
public int size() {
return num.length;
}
}
class MyIterator implements Iterator{
private Collection collection;
private int pos = -1;
public MyIterator(Collection collection){
this.collection = collection;
}
@Override
public Object previous() {
if(pos > 0){
pos--;
}
return collection.get(pos);
}
@Override
public Object next() {
if(pos < collection.size() - 1){
pos ++;
}
return collection.get(pos);
} @Override
public boolean hasNext() {
if(pos < collection.size() - 1){
return true;
}else{
return false;
}
} @Override
public Object first() {
pos = 0;
return collection.get(pos);
} }
public class IteratorTest {
public static void main(String[] args){
Collection col = new MyCollection(10);
for(int i = 0 ; i < 10;i++){
col.add(i * 23);
}
Iterator it = col.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
Java设计模式(八)观察者模式 迭代器模式的更多相关文章
- 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...
- Java设计模式学习记录-迭代器模式
前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...
- Java设计模式系列之迭代器模式
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...
- Java设计模式8:迭代器模式
迭代器模式 迭代器模式又叫做游标(Cursor)模式,其作用是提供一种方法访问一个容器元素中的各个对象,而又不暴露该对象的内部细节. 迭代器模式结构 迭代器模式由以下角色组成: 1.迭代器角色 负责定 ...
- JAVA设计模式之【迭代器模式】
迭代器模式 聚合类,聚合对象 电视机遥控器,迭代器,遍历局和对象中的成员 灵活新增遍历方法 将负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离.这就是迭代器模式. 灵活性,可扩 ...
- 《JAVA设计模式》之迭代器模式(Iterator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- Java设计模式之《外观模式》及应用场景
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
随机推荐
- Base64加密解密原理以及代码实现
1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符. 2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...
- 【Android基础】单元测试的配置
1.在AndroidManifest清单文件中进行配置 <application android:allowBackup="true" android:debuggable= ...
- 全栈JavaScript之路(十七)HTML5 新增字符集属性
HTML5 添加�了几个文档字符集属性. document.charset : 表示文档的实际使用的字符集. document.defaultCharset: 表示默认的字符集,跟浏览器以及操作系统设 ...
- linux shell 不同进制数据转换(二进制,八进制,十六进制,base64) (转)
shell可以在不调用第3方命令,表示不同进制数据.这里总结以下表示方法.shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值.如:以 0 ...
- android 反编译,反,注射LOG
反编译smali注射显示LOG该代码.以后使用: .class public Lnet/iaround/connector/DebugClass; .super Ljava/lang/Object; ...
- 【Hibernate步步为营】--(一对多映射)之双向关联
上篇文章讨论了单向关联的一对多映射,在一的一端维护双向的关系这样的做法尽管能实现可是存在非常多缺陷,首先生成非常多多余的SQL语句,由于多的一端不维护关系,仅仅有一的一端维护,在进行操作时一的一端会发 ...
- 【SSH2(实用文章)】--Struts2文件上传和下载的例子
回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...
- Eclipse SDK构建J2EE开发环境
鄙视官Java EE Developers 体积庞大的兄弟们可以提出自己的J2EE开发环境! 1.第一次去Eclipse官网下载Eclipse IDE 我使用的是:Eclipse IDE for Ja ...
- Visual Studio Team Services使用教程--默认团队权限说明
- 杭电1233还是畅通project
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...