📄 singletonpattern.java
字号:
/* @<#>SingletonPattern.java version 0.0.1, 1/1/2000
*
* THIS PROGRAM IS FREE SOFTWARE; YOU CAN DISTRIBUTE IT AND/OR
* MODIFY IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE
* AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION.
*
* THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE
* GNU GENERAL PUBLIC LICENSE FOR MORE DETAILS.
*
* Copyright (c) 2000 Wayne State University. All Rights Reserved.
*/
package naplet.itinerary;
/**
* The <code>SingletonPattern</code> implements singleton
* itineraries, together with an associated implementation of
* <code>ItineraryIterator</code>. A singleton itinerary
* contains a single server.
*
* @version 0.0.1, 1/1/2000
* @author C. Xu
*/
import java.util.NoSuchElementException;
import java.lang.reflect.*;
import naplet.*;
/*
* Since JDK1.3, the <code>Collections</code>
* class contains a new method <code>singletonList</code>, which returns
* a list with a single object. This may simplify the implementation of
* SingletonPattern. -- cxu
*/
public class SingletonPattern implements ItineraryPattern {
private URN server; // Site to be visited
private Checkable guard; // Precondition of the visit
private ItineraryIterator iter;
private Operable action; // Post-action of the visit
public SingletonPattern( String urnStr) throws InvalidItineraryException {
this(null, urnStr, null);
}
public SingletonPattern( String urnStr, Operable act) throws InvalidItineraryException {
this(null, urnStr, act);
}
public SingletonPattern( Checkable guard, String urnStr) throws InvalidItineraryException {
this(guard, urnStr, null);
}
public SingletonPattern( Checkable guard, String urnStr, Operable act ) throws InvalidItineraryException {
try {
this.guard = guard;
server = new URN(urnStr);
iter = new IteratorImpl();
action = act;
} catch (InvalidURNException iue) {
throw new InvalidItineraryException("Invalid server name");
}
}
public URN first() {
return server;
}
public void reset() {
iter.reset();
}
public synchronized Object clone() {
try {
SingletonPattern si = (SingletonPattern)super.clone();
// si.server = (URN)server.clone();
si.guard = guard;
si.server = server;
si.iter = (ItineraryIterator)iter.clone();
si.action = action;
return si;
} catch (CloneNotSupportedException e) {
throw new NapletInternalError();
}
}
public String toString() {
return server.toString();
}
public void go(Naplet nap ) throws java.rmi.RemoteException {
/*
System.out.println("Beginning of go");
System.out.println(" Current="+nap.getItinerary().getRoute().toString());
if (nap.getItinerary().peekRoute() != null )
System.out.println(" Top ="+nap.getItinerary().peekRoute().toString());
*/
URN nsa = null;
if (iter.hasNext() ) {
nsa = ((SingletonPattern)iter.next()).server;
System.out.println("Next server is " + nsa.toString() );
// Site visit under the guardian of a pre-condition
if ( guard == null || guard.check(nap) )
nap.getNapletContext().getNavigator().toDispatch( nsa, nap );
else {
System.out.println("Next server won't be visited!");
ItineraryPattern itin = nap.getItinerary().popRoute();
if (itin==null) {
System.out.println("End of itinerary");
} else {
nap.getItinerary().setRoute( itin );
itin.go(nap);
}
}
} else {
if (action != null ) {
action.operate(nap);
}
// Reset the iterator for possible itinerary loop
iter.reset();
ItineraryPattern itin = nap.getItinerary().popRoute();
if (itin==null) {
System.out.println("End of itinerary");
} else {
nap.getItinerary().setRoute( itin );
itin.go(nap);
}
}
}
class IteratorImpl implements ItineraryIterator {
Boolean flag;
public IteratorImpl() {
flag = new Boolean(true);
}
public synchronized Object clone() {
try {
IteratorImpl ii = (IteratorImpl)super.clone();
ii.flag = new Boolean( flag.booleanValue() );
return ii;
} catch (CloneNotSupportedException e) {
throw new NapletInternalError();
}
}
public boolean hasNext() {
return flag.booleanValue();
}
public ItineraryPattern next() {
boolean f = flag.booleanValue();
if (f) {
flag = new Boolean( false );
return SingletonPattern.this;
} else
throw new NoSuchElementException();
}
public void reset() {
flag = new Boolean(true);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -