Java设计模式(八)观察者模式 迭代器模式

news/2025/2/24 3:54:04

(十五)观察者模式

观察者模式,定义对象间一对多关系,一个对象状态发生改变,全部依赖于它的对象都收到通知而且自己主动更新,观察者与被观察者分开。比如邮件订阅、RSS订阅,假设有更新就会邮件通知你。

java">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迭代器比这要复杂非常多。

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());
		}
	}
}




http://www.niftyadmin.cn/n/711071.html

相关文章

Java数据结构与算法——冒泡排序

1.关于排序 排序也称排序算法 (Sort Algorithm)&#xff0c;排序是将一 组数据&#xff0c;依指定的顺序进行排列 的过程。 排序的分类&#xff1a; 内部排序: 指将需要处理的所有数据都加载 到内部存储器中进行排序。外部排序法&#xff1a;数据量过大&#xff0c;无法全部加…

Zend Optimizer not installed解决方案

Zend Optimizer not installed解决方案 zend optimizer主要有两个功能&#xff1a; 1、提升PHP程序性能&#xff1b; 2、运行经过zend加密的PHP文件。 今天下了个CMS安装的时候碰到了个棘手问题&#xff0c;安装了N多次ZendOptimizer-3.3.0a-Windows-i386.exe就是不行&#xff…

RandomAccessFile

2019独角兽企业重金招聘Python工程师标准>>> RandomAccessFile是用来访问那些保存数据记录的文件的&#xff0c;你就可以用seek( )方法来访问记录&#xff0c;并进行读写了。这些记录的大小不必相同&#xff1b;但是其大小和位置必须是可知的。但是该类仅限于操作文…

Java数据结构与算法——快速排序

1.关于快排 快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进。基本思想是&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速…

c#图形编程入门

一。如何&#xff1a;创建钢笔 此示例创建一个 Pen 对象。 System.Drawing.Pen myPen; myPen new System.Drawing.Pen(System.Drawing.Color.Tomato); 可靠编程 当使用完需要消耗系统资源的对象&#xff08;如 Pen 对象&#xff09;后&#xff0c;应对其调用 Dispose。 请参见…

Java数据结构与算法——线性查找 二分查找 插值查找

1.线性查找 有一个数列&#xff1a; {1,8, 10, 89, 1000, 1234} &#xff0c;判断数列中是否包含此名称【顺序查找】 要求: 如果找到了&#xff0c;就提示找到&#xff0c;并给出下标值。 package com.szh.search;/*** 线性查找*/ public class SeqSearch {//这里我们实现的线性…

在 Docker 容器中运行应用程序

案例说明 运行 3 个容器&#xff0c;实现对网站的监控。 三个容器的说明: 容器 web: 创建自 nginx 映像&#xff0c;使用 80 端口&#xff0c;运行于后台&#xff0c;实现 web 服务。容器 mailer: 该容器中运行一个 mailer 程序&#xff0c;运行于后台&#xff0c;当接收到事件…

C#中给RichTextBox加上背景图片

在系统自带的RichTextBox中是无法给它设置背景图片&#xff0c;但是我们在某些场合可能需要给RichTextBox设置背景图片。那么怎么实现这一想法呢?经过研究发现通过其它巧妙的途径可以给RichTextBox设置背景图片。首先将RichTextBox这个控件加以改写。具体改写的代码如下&#…