用java描述下面三个故事,要求有极高的重用性,可扩展性。请指教!

  此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 跳下去了!结果有四把降落伞!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值