Pattern Observer:
通过下面的例子来学习观察者模式。 我们有 两个接口Editeur.java和Lecteur.java。可以理解为编辑者和读者。
Editeur的代码如下,它要实现堵住:
package observeur;
public interface Editeur {
<span style="white-space:pre"> </span>public void ajouteLecteur(Lecteur l);
<span style="white-space:pre"> </span>public void surpprimeLecteur(Lecteur l);
<span style="white-space:pre"> </span>public void notifierLecteur();
}
LibData类继承了Editeur接口,这里它有四个成员变量,nbLecture记录读者总数。Lecture类型的ArrayList,用于存放读者。它实现了Editeur的接口方法,代码如下:
package observeur;
import java.util.ArrayList;
public class LibData implements Editeur{
private int ca;
private int nbVol;
private int nbLecteur;
ArrayList<Lecteur> listLecteurs= new ArrayList<Lecteur>();
public void ajouteLecteur(Lecteur l) {
this.listLecteurs.add(l);
}
public void surpprimeLecteur(Lecteur l) {
this.listLecteurs.remove(l);
}
public void notifierLecteur() {
for(Lecteur lecteur: this.listLecteurs){
lecteur.upDate(ca, nbVol, nbLecteur);
}
}
public void dataChanged(){
notifierLecteur();
}
public void setChanged(int ca, int nbVol, int nbLecteur){
this.ca=ca;
this.nbVol=nbVol;
this.nbLecteur=nbLecteur;
dataChanged();
}
}
package observeur;
public interface Lecteur {
public void upDate(int ca, int nbVol, int nbLecteur);
}
AfficheCourant 类继承了Lecture接口,每次实例化它的时候都需要将它注册给一个Editeur。并且它实现了Lecture接口的方法。
package observeur;
public class AfficheCourant implements Lecteur{
private int ca;
private int nbVol;
private int nbLecteur;
private Editeur libData;
public AfficheCourant (Editeur libData) {
this.libData = libData;
libData.ajouteLecteur(this);
}
public void upDate(int ca, int nbVol, int nbLecteur) {
this.ca = ca;
this.nbVol = nbVol;
this.nbLecteur = nbLecteur;
}
public void display(){
System.out.println("ca="+String.valueOf(ca)+" nbVol="+String.valueOf(nbVol)+" bLecteur="+String.valueOf(nbLecteur));
}
}
Main()方法,代码如下:
package observeur;
public class Essi {
public static void main(String[] args) {
// TODO Auto-generated method stub
LibData libData = new LibData();
AfficheCourant afficheCourant = new AfficheCourant(libData);
//afficheStat
libData.setChanged(12, 12, 23);
libData.setChanged(312, 312, 1);
//pour tester le resultat
afficheCourant.display();
}
}
小结:
observateur 可以有N个实例。
Observable 只能有1个实例。
Chaque Abonne a son Editeur.
Pattern Singleton: 有创建出多个实例的风险,因为我们的电脑cpu实际上是单线程运算的,当一个实例恰好运行完了if判断,等于null,这时另一个创建实例的代码也恰好来到if这里判断,那么它的结果页必然是null的,所以这时就会创建出两个实例。
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){//需要<span style="color: rgb(0, 0, 139); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.8048000335693px;">synchronized</span>
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
所以需要synchronise 为了避免多个实例的可能性,在getInstance()方法前面加上synchronized。
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
//class Singleton 和 pattern Singleton 的区别:
Singleton static s = new Singleton (); //static instance
Singleton s = Singleton.getInstance();//pattern Singleton
Pattern Iterator:
这里我们建3个类: Boisson.java, IteratorSurBoisson.java和Main.java。
Boisson.java继承了Iterable接口(java)内定义一个字符串数组boisson,初始值为:{"the","boisson","chocolat"}; 具体代码:
package Iterator;
import java.util.Iterator;
public class Boisson implements Iterable<String> {
String[] boisson= {"the","boisson","chocolat"};
@Override
public Iterator<String> iterator(){
return new IteratorSurBoissons(this);
}
public int length(){
return boisson.length;
}
public final String[] getBoisson() {
return boisson;
}
public final void setBoisson(String[] boisson) {
this.boisson = boisson;
}
}
这里需要我们重写iterator()方法,它返回一个IteratorSurBoissons的实例。
IteratorSurBoissons 类继承了Iterator接口。它有两个成员变量,一个是Boisson,另一个是整型的conpteur,用来记录指针(下标)初始值为0。在它的构造函数里 初始化了Boisson实例。这里要实现hanNext()和next()方法,分别用来判断是否有下一个元素,取下一个元素。 具体代码:
package Iterator;
import java.util.Iterator;
public class IteratorSurBoissons implements Iterator<String>{
private Boisson boissons;
int compteur=0;
public IteratorSurBoissons(Boisson boissonsAparcourir){
this.boissons= boissonsAparcourir;
}
@Override
public boolean hasNext(){
if(this.compteur < boissons.length()){
return true;
}else {
return false;
}
}
@Override
public String next(){
String b = boissons.boisson[compteur];
this.compteur++;
return b;
}
}
main()类里, 创建了一个Boisson实例b,调用此b的iterator()方法 返回一个 Iterator<String>给 packVikingIterator。一个while循环,读取Boisson的值。
package Iterator;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Boisson b = new Boisson();
Iterator<String> packVikingIterator = b.iterator();
while (packVikingIterator.hasNext()) {
System.out.println(packVikingIterator.next());
}
}
}