0 0

大家帮忙看看这个关于命令模式的问题该怎么解决5

这是个关于命令模式的练习。用学生类来生成一个链表,然后在根据学号和姓名来进行查询。要求就是,两种查询方式都要写成命令模式。但是我这里为了让查询方式能够适应变长链表,我把链表的生成方法也写成了命令模式。但是运行的时候出现了问题。
//Student.java文件
package studentcommand1;

public class Student 
{
	public int num;
	public String name;
	public int score;
	public Student next;
	public Student(int nu,String na,int sc,Student ne)
	{
		this.num=nu;
		this.name=na;
		this.score=sc;
		this.next=ne;
	}
	public void setNext(Student t)
	{
		this.next=t;
	}
	public Student getNext()
	{
		return next;
	}
}


//Receiver.java文件
package studentcommand1;

public class Receiver 
{
	public Student stu;
	public int length=1;
	public void add()
	{
		Student stu=new Student(1,"stu1",(int)(Math.random()*100),null);
		for(int i=1;i<10;i++)
		{
			stu.setNext(new Student(i+1,"stu"+(i+1),(int)(Math.random()*100),stu));
			stu=stu.getNext();
			length++;
		}
	}
	
	public void find1(int nu)
	{
		Student st=stu;
		for(int i=0;i<length;i++)
		{
			if(nu==st.num)
			{
				System.out.println("学号为"+nu+"的学生成绩为:"+st.score);
				break;
			}
			else
			{
				st=st.next;
			}
		}
	}
	
	public void find2(String na)
	{
		Student st=stu;
		for(int i=0;i<length;i++)
		{
			if(na.equals(st.name))
			{
				System.out.println("姓名为"+na+"的学生成绩为:"+st.score);
				break;
			}
			else
			{
				st=st.next;
			}
		}
	}
}

//Command.java文件
package studentcommand1;

public abstract class Command 
{
	protected Receiver receiver;
	public Command(Receiver receiver)
	{
		this.receiver=receiver;
	}
	public abstract void execute();
}

//ConcreteCommand1.java文件
package studentcommand1;

public class ConcreteCommand1 extends Command
{
	public Receiver receiver;
	public ConcreteCommand1(Receiver receiver)
	{
		super(receiver);
	}
	@Override
	public void execute()
	{
		receiver.add();
	}
}

另外的两个命令是调用文件就不详细写了,就是把上面这个execute()里的receiver.add()分别改成receiver.find1(2)和receiver.find2("stu3")。
//Invoker.java文件
package studentcommand1;


public class Invoker {

	private Command command;
	private void setCommand(Command command)
	{
		this.command=command;
	}
	public void executeCommand()
	{
		command.execute();
	}
	public static void main(String[] args) 
	{
		
		Receiver receiver=new Receiver();
		
		Invoker invoker=new Invoker();
		
		invoker.setCommand(new ConcreteCommand1(receiver));
		invoker.executeCommand();
		
		invoker.setCommand(new ConcreteCommand2(receiver));
		invoker.executeCommand();
		
		invoker.setCommand(new ConcreteCommand3(receiver));
		invoker.executeCommand();
	}

}

整个代码就这样了,但是运行的时候就提示第一条链表生成的命令invoker.executeCommand()引用的空指针,Debug的时候发现是add()方法跟本没有被调用,并且Debug的进入方法也进不了方法里面,这是什么原因啊。我看编译器也提示说什么使用了过时的什么东东,没搞懂啊!
2012年7月30日 14:31

1个答案 按时间排序 按投票排序

0 0

采纳的答案

public class ConcreteCommand1 extends Command  
{  
    public Receiver receiver;  
    public ConcreteCommand1(Receiver receiver)  
    {  
        super(receiver);  
    }
}
你的super(receiver)初始化了父类的receiver,并没有初始化子类的receiver
所以就会报空指针了 

2012年7月30日 17:09

相关推荐

    Java设计模式经典搞笑珍藏版

    命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 #### 十四、装饰模式(Decorator Pattern) 装饰模式动态地给一个对象添加一些...

    设计模式总结和链接地址

    命令模式将一个请求封装为一个对象,从而使你可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。这种模式可以将请求与执行请求的对象解耦,使得同样的请求可以有不同的接收者。 ### ...

    追MM与Java的23种设计模式

    17. **命令模式** - 你可以把每次约会请求看作一个命令,命令模式封装一个请求作为对象,以便使用不同的请求、队列或者日志请求。 18. **责任链模式** - 在向MM表达情感时,你可能会被拒绝,但还有其他机会。责任链...

    24种设计模式介绍与6大设计原则.pdf

    设计模式是软件工程中一套被广泛认可的、用于解决特定问题的解决方案模板。它们可以分为三大类:创建型模式、结构型模式和行为型模式。 1. **创建型模式**:用于对象的创建过程,包括单例模式、工厂方法模式、抽象...

    24种设计模式介绍与6大设计原则

    命令模式 (Command Pattern)** 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **13. 装饰模式 (Decorator Pattern)** 动态地给一个对象...

    java24种设计模式介绍与6大设计原则

    **命令模式【Command Pattern】** 将一个请求封装为一个对象,从而使用户可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ##### 13. **装饰模式【Decorator Pattern】** ...

    24个设计模式与6大设计原则

    命令模式(Command Pattern) 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 #### 13. 装饰模式(Decorator Pattern) 动态地给一个...

    Java设计模式

    **命令模式 (Command Pattern)** 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **应用场景**:操作日志记录。 ##### 13. **装饰模式 ...

    java设计模式之禅

    ### 十二、命令模式(Command Pattern) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **应用场景**: - 可撤销操作; - 请求队列。 ##...

    精易官方免费模块v3.60版

    2.删除“窗口_消毁” 这个重复命令,该命令和“窗口_关闭”是一样的 感谢 改名卡 的提醒 3.删除“网页_取文本” 增加2个速度更快的命令“网页_取文本_reg”和“网页_取文本_dom” 4.删除“内存_优化” 在程序最小化...

    精易模块[源码] V5.15

    4、修正“IP_10进制转IP”与“IP_16进制转IP”命令反向的问题,感谢易友[@humanbean ]反馈。 5、改善“网页_访问”死循环代码,感谢易友[@67564226]反馈。 6、优化“文本_取随机数字”精简代码,提高执行效率,感谢...

    IO多路复用.md

    - **阻塞**:在阻塞模式下,当一个进程或线程发起一个IO操作时,该进程或线程会暂停所有其他活动,直到操作完成。这意味着在这段时间内,进程无法执行任何其他任务。 - **非阻塞**:而非阻塞模式下,进程或线程发起...

    Thinkpad Slic2.1 marker OEMWindows7

    希望这个对大家有帮忙。教程中所提到的方法和工具,仅供参考,本人不承担任何可能的风险和法律责任。谢谢! 1、如何Marker? 注意:刷过破解版bios的朋友,务必先刷成官方bios!已经是官方bios的略过此步。在这里...

    Thinkpad slic2.1 marker

    希望这个对大家有帮忙。 1、如何Marker? 注意:刷过破解版bios的朋友,务必先刷成官方bios!已经是官方bios的略过此步。在这里还是假设你不是太菜鸟,知道怎么刷bios。 1)首先确定自己Thinkpad机型对应的slic2.1...

Global site tag (gtag.js) - Google Analytics