经典面向对象试题,用Java做

1.国家宝藏
        本·富兰克林·盖茨(尼古拉斯·凯奇饰)是一个喜爱考古的冒险家。从小就梦想要找到国家宝藏,二十年来这个秘密一直萦绕在他的心头,现在他决定完成这一梦想。假设我们知道国家宝藏在哪里,并且想设计一个系统,如果尼古拉斯碰触国家宝藏中的每箱黄金,系统会自动通知宝藏的守护神。 
系统中应该有一个抽象的宝藏类(Treature),宝藏类维护着一个聚集,用于对守护神的跟踪,当宝藏被更动时,通知这些守护神,这个聚集可以用一个向量(Vector)作为宝藏类的Obs属性来实现。该类提供一系列的保护神管理方法,可以增加(addObserver())和删除(deleteObserver())宝藏保护神,以及当宝藏状态被更动时,通知(notifyObservers()
)守护神。当然,宝藏类还要有一些辅助方法,比如探测宝藏状态是否改变的方法(hasChanged()),标记宝藏状态已更动的方法(setChanged())和复位状态变化标志(clearChanged()),以及返回宝藏守护神数目的方法(countObserver())。 
具体的宝藏如黄金(Gold)也应是一个类,且是宝藏类的子类,维护着自己的状态(State),这可以用String型变量来实现。当然还有获得状态(getState())和改变状态(setState())的辅助方法,并且当重新设定的状态与原状态不同时,会通知看护该箱黄金的所有守护神。 
你还可发挥想象力定义其他的具体宝藏类,比如钻石(Diamond)类等等。 
守护神(Eudemon)应是个抽象类或接口,为各种具体的守护神定义一个接口,在得到宝藏的通知时采取行动。这个接口中只包含一个方法update(),用于宝藏状态改变时,具体的保护神所应采取的行动。 
具体的守护神比如老虎(Tiger)就是一个实现了抽象守护神接口中update()方法的具体守护神。你还可发挥想象力定义其他的具体守护神类,比如狮子(Lion)类等等。 
最后,尼古拉斯·凯奇(Cage)也是一个类,且是具体类,他将凭借智慧和勇敢,更动(touchTreature())这些国家宝藏的状态,这可要惊动宝藏的守护神呦......
要求:请根据上面的剧本陈述,设计一个国家宝藏的守护系统,并用Java语言实现你的设计方案
 
 
 
import java.util.Vector;
//抽象宝藏类
public  abstract  class Treature {

 private Vector<Eudemon> ct=null;
 //增加保护神
 public abstract void addObserver(int n);
 //删除保护神
 public abstract void deleteObserver(int n);
 //通知保护神
 public abstract void notifyObservers();
 //探测宝藏是否改变
 public abstract void hasChanged();
 //标记宝藏状态已更动方法
 public abstract void setChanged();
 //复位状态变化标志
 public abstract void clearChanged();
 //返回宝藏守护神数目
 public abstract int countObserver();
}
//金子类
public class Gold  extends Treature{

 private String State="山洞";
 private int servers=10;
 private int gold=5;
 private int cc=0;
 public String getState() {
  return State;
 }

 public void setState(String state) {
  if(!state.equals(this.State))
  {
   this.notifyObservers();
  }
 }

 @Override
 public void addObserver(int n) {
  System.out.println("添加"+n+"个金子的守护神");
  servers=servers+n;
 }

 @Override
 public void clearChanged() {
  this.gold=5;
  this.State="山洞";
  this.hasChanged();
 }

 @Override
 public int countObserver() {
  
  return this.servers;
 }

 @Override
 public void deleteObserver(int n) {
  // TODO Auto-generated method stub
  System.out.println("删除"+n+"个金子守护神");
  this.servers=this.servers-n;
 }

 @Override
 public void hasChanged() {
  System.out.println("已经有人动过金子了!");
  Lion l=new Lion();
  l.update();
  this.setChanged();
 }

 @Override
 public void notifyObservers() {
   System.out.println("有人动了金子!");
   this.hasChanged();
 }

 @Override
 public void setChanged() {
  // TODO Auto-generated method stub
  this.cc++;
 }
}
//抽象守护神类
public abstract class Eudemon {

 public abstract void update();
}
//保护神类
public class Lion extends Eudemon{

 @Override
 public void update() {
  System.out.println("我是芙蓉姐姐保护神,我要恶心死你!");
 }
 
}
//尼古拉斯。凯奇类
public class Cage {
 
  public void touchTreatuer()
 {
   Gold gg=new Gold();
   gg.setState("我家");
 }
}
//测试类
import org.junit.BeforeClass;
import org.junit.Test;

public class Ceshi {

 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
 }
 @Test public void inner()
 {
  Cage cg=new Cage();
  cg.touchTreatuer();
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值