这是个关于命令模式的练习。用学生类来生成一个链表,然后在根据学号和姓名来进行查询。要求就是,两种查询方式都要写成命令模式。但是我这里为了让查询方式能够适应变长链表,我把链表的生成方法也写成了命令模式。但是运行的时候出现了问题。
//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的进入方法也进不了方法里面,这是什么原因啊。我看编译器也提示说什么使用了过时的什么东东,没搞懂啊!
相关推荐
命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 #### 十四、装饰模式(Decorator Pattern) 装饰模式动态地给一个对象添加一些...
命令模式将一个请求封装为一个对象,从而使你可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。这种模式可以将请求与执行请求的对象解耦,使得同样的请求可以有不同的接收者。 ### ...
17. **命令模式** - 你可以把每次约会请求看作一个命令,命令模式封装一个请求作为对象,以便使用不同的请求、队列或者日志请求。 18. **责任链模式** - 在向MM表达情感时,你可能会被拒绝,但还有其他机会。责任链...
设计模式是软件工程中一套被广泛认可的、用于解决特定问题的解决方案模板。它们可以分为三大类:创建型模式、结构型模式和行为型模式。 1. **创建型模式**:用于对象的创建过程,包括单例模式、工厂方法模式、抽象...
命令模式 (Command Pattern)** 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **13. 装饰模式 (Decorator Pattern)** 动态地给一个对象...
**命令模式【Command Pattern】** 将一个请求封装为一个对象,从而使用户可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ##### 13. **装饰模式【Decorator Pattern】** ...
命令模式(Command Pattern) 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 #### 13. 装饰模式(Decorator Pattern) 动态地给一个...
**命令模式 (Command Pattern)** 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **应用场景**:操作日志记录。 ##### 13. **装饰模式 ...
### 十二、命令模式(Command Pattern) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **应用场景**: - 可撤销操作; - 请求队列。 ##...
2.删除“窗口_消毁” 这个重复命令,该命令和“窗口_关闭”是一样的 感谢 改名卡 的提醒 3.删除“网页_取文本” 增加2个速度更快的命令“网页_取文本_reg”和“网页_取文本_dom” 4.删除“内存_优化” 在程序最小化...
4、修正“IP_10进制转IP”与“IP_16进制转IP”命令反向的问题,感谢易友[@humanbean ]反馈。 5、改善“网页_访问”死循环代码,感谢易友[@67564226]反馈。 6、优化“文本_取随机数字”精简代码,提高执行效率,感谢...
- **阻塞**:在阻塞模式下,当一个进程或线程发起一个IO操作时,该进程或线程会暂停所有其他活动,直到操作完成。这意味着在这段时间内,进程无法执行任何其他任务。 - **非阻塞**:而非阻塞模式下,进程或线程发起...
希望这个对大家有帮忙。教程中所提到的方法和工具,仅供参考,本人不承担任何可能的风险和法律责任。谢谢! 1、如何Marker? 注意:刷过破解版bios的朋友,务必先刷成官方bios!已经是官方bios的略过此步。在这里...
希望这个对大家有帮忙。 1、如何Marker? 注意:刷过破解版bios的朋友,务必先刷成官方bios!已经是官方bios的略过此步。在这里还是假设你不是太菜鸟,知道怎么刷bios。 1)首先确定自己Thinkpad机型对应的slic2.1...