⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 singletonpattern.java

📁 移动Agent编程工具Naplet
💻 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 + -