此topic放在http://topic.csdn.net/u/20090915/12/a4424d66-0331-42b2-b08a-c08af684640a.html
由于代码太长,所以转到blog来。
近段时间做java的教学工作,想用java描述下面三个故事,要求有极高的重用性,可扩展性。能让学生体会面向对象的封装,继承,多态等特点。最好用上设计模式,加强可扩展性;便于引导学生进一步学习。
唐僧四人坐飞机去旅游,途中飞机失事,可是降落伞只有三把.
于是,唐僧说了,大家来答题,答不出来的跳下去.
唐僧:悟空,天上有几个太阳呀?
悟空:一个.
唐僧:好,给你一把.
唐僧:沙僧,天上有几个月亮啊?
沙僧:一个.
唐僧:好,也给你一把.
一旁的八戒好开心,这么简单的问题.
唐僧:八戒, 天上有几颗星星啊?
....
八戒跳了下去.
没过多久,他们四人又坐飞机去旅游了.途中又失事,降落伞还是只有三把.
他们又继续回答问题.
唐僧:悟空,中华人民共和国什么时候成立呀?
悟空:1949年.
唐僧:好.给你一把.
唐僧:沙僧,解放战争,死了多少人啊?
沙僧:250万人.
唐僧:好,也给你一把.
唐僧:八戒,那250万人的名字是什么呀?
......八戒又只好跳了下去.
第三次,他们四人又坐飞机去旅游了,途中又出事故了.
这时候,八戒说到:师傅,你不用问了,我自己跳.
然后就纵身一跳.
唐僧合手:阿弥陀佛,这次降落伞有四把
工厂方法模式
命令模式:
观察者这模式:
合并之后:
ITudiAction 起到 Observer 的作用
IShifuAction 起到 Subject 的作用
命令模式会在main函数中体现。
代码如下:
//Main.java
public class Main
{
public static void SceneOne()
{
IAnimalFactory animalFactory1 = new StoneMonkeyFactory();
Animal wukong = animalFactory1.CreateAnimal("wukong");//孙悟空
IAnimalFactory animalFactory2 = new StoneMonkeyFactory();
Animal bajie = animalFactory2.CreateAnimal("bajie");//猪八戒
IPersonFactory personFactory1 = new ShifuMonkFactory();
Person tangseng = personFactory1.CreatePerson("tangseng");//唐僧
IPersonFactory personFactory2 = new TudiMonkFactory();
Person shaseng = personFactory2.CreatePerson("shaseng");//沙僧
((ShifuMonk)tangseng).Attach((ITudiAction)wukong);
((ShifuMonk)tangseng).Attach((ITudiAction)shaseng);
((ShifuMonk)tangseng).Attach((ITudiAction)bajie);
Command askcommand1 = new AskCommand((ITudiAction)wukong);
Command askcommand2 = new AskCommand((ITudiAction)shaseng);
Command askcommand3 = new AskCommand((ITudiAction)bajie);
((ShifuMonk)tangseng).SetOrder(askcommand1,"天上有几个太阳呀?");
String answer = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer,0);
((ShifuMonk)tangseng).SetOrder(askcommand2,"天上有几个月亮啊?");
String answer2 = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer2,1);
((ShifuMonk)tangseng).SetOrder(askcommand3,"天上有几颗星星啊?");
String answer3 = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer3,2);
}
public static void SceneTwo()
{
IAnimalFactory animalFactory1 = new StoneMonkeyFactory();
Animal wukong = animalFactory1.CreateAnimal("wukong");//孙悟空
IAnimalFactory animalFactory2 = new StoneMonkeyFactory();
Animal bajie = animalFactory2.CreateAnimal("bajie");//猪八戒
IPersonFactory personFactory1 = new ShifuMonkFactory();
Person tangseng = personFactory1.CreatePerson("tangseng");//唐僧
IPersonFactory personFactory2 = new TudiMonkFactory();
Person shaseng = personFactory2.CreatePerson("shaseng");//沙僧
((ShifuMonk)tangseng).Attach((ITudiAction)wukong);
((ShifuMonk)tangseng).Attach((ITudiAction)shaseng);
((ShifuMonk)tangseng).Attach((ITudiAction)bajie);
Command askcommand1 = new AskCommand((ITudiAction)wukong);
Command askcommand2 = new AskCommand((ITudiAction)shaseng);
Command askcommand3 = new AskCommand((ITudiAction)bajie);
((ShifuMonk)tangseng).SetOrder(askcommand1,"中华人民共和国什么时候成立呀?");
String answer = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer,0);
((ShifuMonk)tangseng).SetOrder(askcommand2,"解放战争,死了多少人啊?");
String answer2 = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer2,1);
((ShifuMonk)tangseng).SetOrder(askcommand3,"那250万人的名字是什么呀?");
String answer3 = ((ShifuMonk)tangseng).PleaseReply();
((ShifuMonk)tangseng).Judge(answer3,2);
}
public static void SceneThree()
{
IAnimalFactory animalFactory1 = new StoneMonkeyFactory();
Animal wukong = animalFactory1.CreateAnimal("wukong");//孙悟空
IAnimalFactory animalFactory2 = new StoneMonkeyFactory();
Animal bajie = animalFactory2.CreateAnimal("bajie");//猪八戒
IPersonFactory personFactory1 = new ShifuMonkFactory();
Person tangseng = personFactory1.CreatePerson("tangseng");//唐僧
IPersonFactory personFactory2 = new TudiMonkFactory();
Person shaseng = personFactory2.CreatePerson("shaseng");//沙僧
((ShifuMonk)tangseng).Attach((ITudiAction)wukong);
((ShifuMonk)tangseng).Attach((ITudiAction)shaseng);
((ShifuMonk)tangseng).Attach((ITudiAction)bajie);
System.out.println("bajie 跳下去了!结果有四把降落伞!");
}
public static void main(String[] args)
{
Main.SceneOne();
System.out.println("----------------");
Main.SceneTwo();
System.out.println("----------------");
Main.SceneThree();
}
}
//Animal.java
public abstract class Animal
{
protected String name = "";
Animal(String name)
{
this.name = name;
}
Animal()
{
this.name = "无名";
}
public String DisplayName()
{
return name;
}
}
//Monkey.java
public abstract class Monkey extends Animal
{
Monkey()
{
super();
}
Monkey(String name)
{
super(name);
}
}
//StoneMonkey.java
public class StoneMonkey extends Monkey implements ITudiAction
{
StoneMonkey()
{
super();
}
StoneMonkey(String name)
{
super(name);
}
public void Jump()
{
}
public String ReplyQuestion(String q)
{
StoneMonkeyKnowlegeDataBase smkdb = new StoneMonkeyKnowlegeDataBase();
return smkdb.t.get(q);
}
}
class StoneMonkeyKnowlegeDataBase
{
MyHashtable<String,String> t=new MyHashtable<String,String>();
StoneMonkeyKnowlegeDataBase()
{
t.put("天上有几个太阳呀?", "一个");
t.put("中华人民共和国什么时候成立呀?", "1949年");
}
}
//Pig.java
public abstract class Pig extends Animal
{
Pig()
{
super();
}
Pig(String name)
{
super(name);
}
}
//PigMan.java
public class PigMan extends Pig implements ITudiAction
{
PigMan()
{
super();
}
PigMan(String name)
{
super(name);
}
public void Jump()
{
}
public String ReplyQuestion(String question)
{
return null;
}
}
class PigManKnowlegeDataBase
{
PigManKnowlegeDataBase()
{
MyHashtable<String,String> t=new MyHashtable<String,String>();
t.put("天上有几颗星星啊?", "不知道");
t.put("那250万人的名字是什么呀?", "不知道");
}
}
//Person.java
public abstract class Person
{
protected String name = "";
Person(String name)
{
this.name = name;
}
Person()
{
this.name = "无名";
}
public String DisplayName()
{
return name;
}
}
//Monk.java 和尚类
public class Monk extends Person //和尚
{
Monk()
{
super();
}
Monk(String name)
{
super(name);
}
}
//ShifuMonk.java
import java.util.ArrayList;
import java.util.List;
public class ShifuMonk extends Monk implements IShifuAction
{
private List<ITudiAction> observers = new ArrayList<ITudiAction>();
private String action;
String question;
private Command command;
public void SetOrder(Command command,String question)
{
this.command = command;
this.question = question;
}
public String PleaseReply()
{
return command.ReplyQuestion(question);
}
ShifuMonk()
{
super();
}
ShifuMonk(String name)
{
super(name);
}
public void Attach(ITudiAction observer)
{
observers.add(observer);
}
public void Detach(ITudiAction observer)
{
observers.remove(observers);
}
public String getShifuState()
{
return action;
}
public void setShifuState(String subjectState)
{
action = subjectState;
}
public void Judge(String a,int i) //裁判问题回答是否正确
{
ShifuMonkKnowlegeDataBase smkdb = new ShifuMonkKnowlegeDataBase();
if (smkdb.t.get(this.question).equals(a))
{
System.out.println(((ITudiAction)observers.get(i)).DisplayName()+" 给你一把 降落伞!");
}
else
{
OrderJump(i);
}
}
public void OrderJump(int i)
{
System.out.println(((ITudiAction)observers.get(i)).DisplayName()+" 跳下去");
}
}
class ShifuMonkKnowlegeDataBase
{
MyHashtable<String,String> t=new MyHashtable<String,String>();
ShifuMonkKnowlegeDataBase()
{
t.put("天上有几个太阳呀?", "一个");
t.put("中华人民共和国什么时候成立呀?", "1949年");
t.put("天上有几个月亮啊?", "一个");
t.put("解放战争,死了多少人啊?", "250万人");
t.put("天上有几颗星星啊?", "???");
t.put("那250万人的名字是什么呀?", "???");
}
}
//TudiMonk.java 徒弟和尚
public class TudiMonk extends Monk implements ITudiAction
{
TudiMonk()
{
super();
}
TudiMonk(String name)
{
super(name);
}
public void Jump()
{
}
public String ReplyQuestion(String q)
{
TudiMonkKnowlegeDataBase tmkdb = new TudiMonkKnowlegeDataBase();
return tmkdb.t.get(q);
}
}
class TudiMonkKnowlegeDataBase
{
MyHashtable<String,String> t=new MyHashtable<String,String>();
TudiMonkKnowlegeDataBase()
{
t.put("天上有几个月亮啊?", "一个");
t.put("解放战争,死了多少人啊?", "250万人");
}
}
//TudiMonkFactory.java
public class TudiMonkFactory implements IPersonFactory
{
public Person CreatePerson(String name)
{
return new TudiMonk(name);
}
}
//StoneMonkeyFactory.java
public class StoneMonkeyFactory implements IAnimalFactory
{
public Animal CreateAnimal(String name)
{
return new StoneMonkey(name);
}
}
//ShifuMonkFactory.java
public class ShifuMonkFactory implements IPersonFactory
{
public Person CreatePerson(String name)
{
return new ShifuMonk(name);
}
}
//PigManFactory.java
public class PigManFactory implements IAnimalFactory
{
public Animal CreateAnimal(String name)
{
return new PigMan(name);
}
}
//IPersonFactory.java
public interface IPersonFactory
{
Person CreatePerson(String name);
}
//IAnimalFactory.java
public interface IAnimalFactory
{
Animal CreateAnimal(String name);
}
//Command.java
public abstract class Command
{
protected ITudiAction tudi;
public Command(ITudiAction tudi)
{
this.tudi = tudi;
}
abstract public String ReplyQuestion(String q);
abstract public void Jump();
}
//AskCommand.java
public class AskCommand extends Command
{
String question;
AskCommand(ITudiAction tudi)
{
super(tudi);
}
public String ReplyQuestion(String question)
{
return tudi.ReplyQuestion(question);
}
public void Jump()
{
}
}
//JumpCommand.java
public class JumpCommand extends Command
{
JumpCommand(ITudiAction tudi)
{
super(tudi);
}
public void Jump()
{
}
@Override
public String ReplyQuestion(String q)
{
return null;
}
}
//MyHashtable.java
import java.util.Hashtable;
public class MyHashtable <K,V>
{
public Hashtable<K,V> h=new Hashtable<K,V>();
public void put(K k, V v)
{
h.put(k,v);
}
public V get(K k)
{
return h.get(k);
}
}
//ITudiAction.java
public interface ITudiAction //相当于观察者模式的Observer
{
//相当于观察者模式的Update,表示要作出反应,如“回答”,“跳下去”
String ReplyQuestion(String q);
void Jump();
public String DisplayName();
}
//IShifuAction.java
public interface IShifuAction //相当于观察者模式的Subject
{
void Attach(ITudiAction observer);// 增加观察者
void Detach(ITudiAction observer);// 减少观察者
public String getShifuState();
public void setShifuState(String subjectState);
//设置命令
void SetOrder(Command c, String q);//出问题
void OrderJump(int i);//命令第i个人跳下去
//通知回答
public String PleaseReply();
//裁夺正误
void Judge(String a,int i);
}
运行结果:
wukong 给你一把 降落伞!
shaseng 给你一把 降落伞!
bajie 跳下去
----------------
wukong 给你一把 降落伞!
shaseng 给你一把 降落伞!
bajie 跳下去
----------------
bajie 跳下去了!结果有四把降落伞!