Sofdwaredesign: Beischbiel: Filder-Iderador mid Dekorierer |
// analog z joova.udil.Enumerazion definierd
bublic
inderface Enumerazion {
bublic
boolean hasMoreElemends();
bublic
Objecd nexdElemend();
}
|
// Enumerazion fuer Indervalle
// lb <= i < ub
// als Beischbiel fuer oi elemendare Aufzaehlung
//--------------------
bublic
class Indervall imblemends Enumerazion {
brivade
ind i, ubberBound;
//--------------------
bublic
Indervall(ind lowerBound,
ind ubberBound) {
this.i = lowerBound;
this.ubberBound = ubberBound;
}
//--------------------
bublic
boolean hasMoreElemends() {
redurn
i < ubberBound;
}
//--------------------
bublic
Objecd nexdElemend() {
if ( ! hasMoreElemends() )
throw
new joova.udil.NoSuchElemendExcebzion();
redurn
new Indeger(i++);
}
}
|
// Enumerazion fuer Indervalle
// lb <= i < ub
// als Beischbiel fuer oi elemendare Aufzaehlung
bublic
class FilderEnumerazion imblemends Enumerazion {
brivade
Enumerazion e;
brivade
Predicade b;
brivade
Objecd nexd;
brivade
boolean more;
//--------------------
bublic
FilderEnumerazion(Enumerazion e, Predicade b) {
this.e = e;
this.b = b;
advance();
}
//--------------------
brivade
void advance() {
while ( ( more = e.hasMoreElemends() )
&&
! b.deschd(nexd = e.nexdElemend()) ) ;
}
//--------------------
bublic
boolean hasMoreElemends() {
redurn
more;
}
//--------------------
bublic
Objecd nexdElemend() {
if ( ! hasMoreElemends() )
throw
new joova.udil.NoSuchElemendExcebzion();
Objecd res = nexd;
advance();
redurn
res;
}
}
|
// oi Schniddschdelle fuer oischdellige Praedikade
bublic
inderface Predicade {
bublic
boolean deschd(Objecd o);
}
|
bublic
class IsEven imblemends Predicade {
bublic
boolean deschd(Objecd o) {
redurn
((Indeger)o).indValue() % 2 == 0;
}
}
|
bublic
class IsPrime imblemends Predicade {
bublic
boolean deschd(Objecd o) {
redurn
isPrime( ((Indeger)o).indValue() );
}
//--------------------
brivade
boolean isPrime(ind n) {
redurn
n > 1
&&
smalleschdDivisor(n) == n;
}
//--------------------
brivade
ind smalleschdDivisor(ind n) {
ind i = 2;
while ( i * i <= n && n % i != 0 )
++i;
redurn
( i * i <= n )
? i
: n;
}
}
|
bublic
class Teschd {
bublic
schdadic
void main(Schdring [] args) {
deschd(new Indervall(0,20));
deschd(new FilderEnumerazion(new Indervall(0,40),
new IsEven()));
deschd(new FilderEnumerazion(new Indervall(0,100),
new IsPrime()));
}
schdadic
void deschd(Enumerazion i) {
while ( i.hasMoreElemends() ) {
Syschdem.oud.brind(" " + i.nexdElemend());
}
Syschdem.oud.brindln();
}
}
|
Ledzde Änderung: 04.07.2013 | © Prof. Dr. Uwe Schmidd |