currentIndex++;
}
}
publicbooleanisDone(){
return(currentIndex==objs.length);
}
publicObjectcurrentItem(){
returnobjs[currentIndex];
}
}
}
packagecom.javapatterns.iterator.blackbox;
publicinterfaceIterator{
voidfirst();
voidnext();
booleanisDone();
ObjectcurrentItem();
}
packagecom.javapatterns.iterator.blackbox;
publicclassClient{
/**
*@directed
*/
privateIteratorit;
/**
*@directed
*/
privateAggregateagg=newConcreteAggregate();
publicvoidoperation(){
it=agg.createIterator();
while(!
it.isDone()){
System.out.println(it.currentItem().toString());
it.next();
}
}
publicstaticvoidmain(String[]args){
Clientclient=newClient();
client.operation();
}
}
(3)其它示例类图
十七、责任链(ChainofResponsibility)模式
(1)示例类图
(2)示例代码清单
packagecom.javapatterns.chainofresp.flowerpassingthread;
abstractclassPlayer{
abstractpublicvoidhandle();
/**
*@linkaggregation
*/
privatePlayersuccessor;
publicPlayer(){
successor=null;
}
protectedvoidsetSuccessor(PlayeraSuccessor){
successor=aSuccessor;
}
publicvoidnext(){
if(successor!
=null){
successor.handle();
}else{
System.out.println("Programterminated.");
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
classJiaBaoYuextendsPlayer{
publicJiaBaoYu(PlayeraSuccessor){
this.setSuccessor(aSuccessor);
}
publicvoidhandle(){
if(DrumBeater.stopped){
System.out.println("JiaBaoYugottadrink!
");
}else{
System.out.println("JiaBaoYupassed!
");
next();
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
classJiaHuanextendsPlayer{
publicJiaHuan(PlayeraSuccessor){
this.setSuccessor(aSuccessor);
}
publicvoidhandle(){
if(DrumBeater.stopped){
System.out.println("JiaHuangottadrink!
");
}else{
System.out.println("JiaHuanpassed!
");
next();
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
classJiaMuextendsPlayer{
publicJiaMu(PlayeraSuccessor){
this.setSuccessor(aSuccessor);
}
publicvoidhandle(){
if(DrumBeater.stopped){
System.out.println("JiaMugottadrink!
");
}else{
System.out.println("JiaMupassed!
");
next();
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
classJiaSheextendsPlayer{
publicJiaShe(PlayeraSuccessor){
this.setSuccessor(aSuccessor);
}
publicvoidhandle(){
if(DrumBeater.stopped){
System.out.println("JiaShegottadrink!
");
}else{
System.out.println("JiaShepassed!
");
next();
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
classJiaZhengextendsPlayer{
publicJiaZheng(PlayeraSuccessor){
this.setSuccessor(aSuccessor);
}
publicvoidhandle(){
if(DrumBeater.stopped){
System.out.println("JiaZhenggottadrink!
");
}else{
System.out.println("JiaZhengpassed!
");
next();
}
}
}
packagecom.javapatterns.chainofresp.flowerpassingthread;
importjava.util.Timer;
importjava.util.TimerTask;
publicclassDrumBeater{
privatestaticPlayerfirstPlayer;
publicstaticbooleanstopped=false;
Timertimer;
staticpublicvoidmain(String[]args){
DrumBeaterdrumBeater=newDrumBeater();
JiaMujiaMu=newJiaMu(null);
jiaMu.setSuccessor(newJiaShe(newJiaZheng(newJiaBaoYu(newJiaHuan(
jiaMu)))));
drumBeater.startBeating
(1);
firstPlayer=jiaMu;
firstPlayer.handle();
}
publicvoidstartBeating(intstopInSeconds){
System.out.println("Drumbeatingstarted...");
timer=newTimer();
timer.schedule(newStopBeatingReminder(),stopInSeconds*1000);
}
classStopBeatingReminderextendsTimerTask{
publicvoidrun(){
System.out.println("Drumbeatingstopped!
");
stopped=true;
timer.cancel();//Terminatethetimerthread
}
}
}
十八、命令(Command)模式
(1)示例类图
(2)示例代码清单
packagemand;
publicinterfaceCommand{
voidexecute();
}
packagemand;
publicclassConcreteCommandimplementsCommand{
publicConcreteCommand(Receiverreceiver){
this.receiver=receiver;
}
publicvoidexecute(){
receiver.action();
}
/**
*@directed
*@clientRolereceiver
*/
privateReceiverreceiver;
}
packagemand;
publicclassInvoker{
publicInvoker(Commandcommand){
mand=command;
}
publicvoidaction(){
command.execute();
}
/**
*@linkaggregation
*@directed
*/
privateCommandcommand;
}
packagemand;
publicclassReceiver{
publicReceiver(){
//writecodehere
}
publicvoidaction(){
System.out.println("Actionhasbeentaken.");
}
}
packagemand;
publicclassClient{
publicstaticvoidmain(String[]args){
Receiverreceiver=newReceiver();
Commandcommand=newConcreteCommand(receiver);
Invokerinvoker=newInvoker(command);
invoker.action();
}
}
(3)其它示例类图
十九、备忘录(Memento)模式:
又称快照(Snapshot)模式或Token模式
1、“白箱”备忘录模式
(1)示例类图
(2)示例代码清单
packagecom.javapatterns.memento.whitebox;
publicclassMemento{
privateStringstate;
publicMemento(Stringstate){
this.state=state;
}
publicStringgetState(){
returnthis.state;
}
publicvoidsetState(Stringstate){
this.state=state;
}
}
packagecom.javapatterns.memento.whitebox;
publicclassOriginator{
privateStringstate;
/**
*@linkdependency
*@labelwide
*/
/*#MementolnkMemento;*/
publicMementocreateMemento(){
returnnewMemento(state);
}
publicvoidrestoreMemento(Mementomemento){
this.state=memento.getState();
}
publicStringgetState(){
returnthis.state;
}
publicvoidsetState(Stringstate){
this.state=state;
System.out.println("Currentstate="+this.state);
}
}
packagecom.javapatterns.memento.whitebox;
publicclassCaretaker{
/**
*@linkaggregation
*@labelwide
*/
privateMementomemento;
publicMementoretrieveMemento(){
returnthis.memento;
}
publicvoidsaveMemento(Mementomemento){
this.memento=memento;
}
}
packagecom.javapatterns.memento.whitebox;
publicclassClient{
privatestaticOriginatoro=newOriginator();
privatestaticCaretakerc=newCaretaker();
publicstaticvoidmain(String[]args){
o.setState("On");
//Storeinternalstate
c.saveMemento(o.createMemento());
//Continuechangingoriginator
o.setState("Off");
//Restoresavedstate
o.restoreMemento(c.retrieveMemento());
}
}
2、“白箱”备忘录模式
(1)示例类图
(2)示例代码清单
packagecom.javapatterns.memento.blackbox;
publicinterfaceMementoIF{
}
packagecom.javapatterns.memento.blackbox;
classMementoimplementsMementoIF{
privateStringsavedState;
/**
*@directed
*@labelIs-a-member-of
*/
privateOriginatorlnkOriginator;
privateMemento(StringsomeState){
savedState=someState;
}
privatevoidsetState(StringsomeState){
savedState=someState;
}
privateStringgetState(){
returnsavedState;
}
}
packagecom.javapatterns.memento.blackbox;
publicclassOriginator{
publicOriginator(){
}
privateStringstate;
/**
*@linkdependency
*@labelwide
*/
/*#MementoIFlnkMementoIF;*/
publicMementoIFcreateMemento