经典面向对象题,用Java做,要详细点的。

夏日麽麽茶
在一个茶庄(TeaStall)所使用的系统里,有各种风味的名茶。
茶(Tea)在系统中要用一个类代表,它有一个属性(Flavor)。
茶庄的菜单(TeaMenu)在系统中以用类来表示,也可用接口来实现。其中包含了茶庄中可供顾客点的茶。比如"西湖龙井","洞庭碧螺春","白毫银针","君山银针","黄山毛峰","武夷岩茶","安溪铁观音","信阳毛尖","庐山云雾","六安瓜片"等。
茶庄的沏茶员(InfuseMan)是系统中的一个类,他可以根据侍者(Waitor)所下的单,冲泡各种风味的茶,如果订单中风味的茶已沏好,就直接为侍者提供(getTea())茶;如果还没沏好则先冲泡再给侍者提供。沏茶员负责维护茶壶柜(teapotCabinet)和冲泡好的风味数(totalFlavors),这些都可作为沏茶员的属性来维护。由于一个茶庄所能提供的风味数是没有限制的,所以茶壶柜(teapotCabinet)应该能动态调整大小,以容纳下未知数量的茶壶,这可以由一个向量Vecotor来实现。闭店时,沏茶员可以统计(getTotalFlavors())一天冲泡的风味数。
茶客(TeaClient)也是系统中的一个类,他最喜欢的风味(favoriteFlavor)是一个属性。茶客每天根据菜单点(whatIsYourFavoriteFlavor())适合自己心情的茶。
侍者(Waitor)也是一个类,他担负着茶客和沏茶员之间的桥梁。他询问茶客最喜欢的风味,并根据顾客的要求下单(takeOrder())给沏茶员,从沏茶员那里接过茶杯放于茶盘(TeacupTray)上,茶盘也可以用一个向量Vector来表示,作为侍者的一个属性由侍者维护。侍者将茶盘上的茶杯端给(serveTeacup())顾客。侍者会在一天中,统计自己招待过的订单数(totalOrders),这可作为侍者的一个属性实现,并在闭店时,统计(getTotalOrders())服务的订单数。
茶庄(TeaStall)也是系统中的一个类,它聚集了菜单、沏茶员、侍者、顾客,它在创建时会指定一个可容纳的最多顾客数(CLIENT_MAX_NUM),每天开店(open())时,派出一位沏茶员和一位侍者,并接待最多数量的顾客。侍者迎接顾客,为顾客下单,沏茶员沏好茶后,侍者会用茶盘将茶端给顾客。每天闭店(close())后,会统计当天的订单数和沏茶
风味数。 要求:你可能玩过大富翁、主题公园、主题医院等策略游戏,这个茶庄系统,就是这类游戏的一个原型,请你

根据上述脚本,用Java语言设计这个主题茶馆,发挥你的想象力吧!

package local.tea;

import local.tea.Tea.Flavor;

public class InfuseMan extends TTobj {

public InfuseMan(String name) {
super(name);
}

public void takeTea(Flavor flavor, TeacupTray tt) {
tt.setTea(new Tea(flavor));
System.out.println(name + " 沏了一杯 " + flavor );
TeaStall.releaseInfuseMan(this);
}

}
package local.tea;

public class TTobj {
protected String name;

public TTobj(String name) {
this.name = this.getClass().getSimpleName() + name;
}
}
package local.tea;

public class Tea {
public static enum Flavor {
西湖龙井, 洞庭碧螺春, 白毫银针, 君山银针, 黄山毛峰, 武夷岩茶, 安溪铁观音, 信阳毛尖, 庐山云雾, 六安瓜片
}

private Flavor flavor;

public Tea(Flavor flavor) {
this.setFlavor(flavor);
}

public void setFlavor(Flavor flavor) {
this.flavor = flavor;
}

public Flavor getFlavor() {
return flavor;
}
}
package local.tea;

public class TeaClient extends TTobj implements Runnable {

Tea.Flavor favoriteFlavor = Tea.Flavor.六安瓜片;

public TeaClient(String string) {
super(string);
System.out.println(this.name + " 大驾光临");
}

public TeaClient(String name, Tea.Flavor flavor) {
this(name);
favoriteFlavor = flavor;
}

@Override
public void run() {
Tea tea = null;
Waiter waiter = null;
try {
System.out.println(name + " 小二!沏杯茶!" + favoriteFlavor);
waiter = TeaStall.takeWaiter();
waiter.takeOrder(favoriteFlavor);
tea = waiter.takeTea();
} catch (InterruptedException e) {
System.out.println(name + " 没人理我啊!我愤然离开!" + e.getStackTrace());
return;
}

System.out.println(name + " 品尝并称赞着 " + tea.getFlavor());
if (waiter != null) {
waiter.release();
}
System.out.println(name + " 我走啦~");

}

}
package local.tea;

public class TeaMenu {
Tea tea;
}
package local.tea;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TeaStall {
private static String name = "有家茶庄";
public static final int CLIENT_MAX_NUM = 5;

private static BlockingQueue<InfuseMan> infuseMen = new ArrayBlockingQueue<InfuseMan>(
1);
private static BlockingQueue<Waiter> waiters = new ArrayBlockingQueue<Waiter>(
1);

/**
* @param args
*/
public static void main(String[] args) {
waiters.add(new Waiter("【小二张】"));
infuseMen.add(new InfuseMan("【烹煮沏】"));

System.out.println(name + " 开门啦");

new Thread(new TeaClient("【梁朝伟】")).start();
new Thread(new TeaClient("【刘嘉玲】", Tea.Flavor.武夷岩茶)).start();

System.out.println(name + " 打烊啦");
}

public static Waiter takeWaiter() throws InterruptedException {
return waiters.take();
}

public static void releaseWaiter(Waiter waiter) {
waiters.add(waiter);
}

public static InfuseMan takeInfuseMan() throws InterruptedException {
return infuseMen.take();
}

public static void releaseInfuseMan(InfuseMan im) {
infuseMen.add(im);

}

}
package local.tea;

public class Waiter extends TTobj {
public Waiter(String name) {
super(name);
}

Tea.Flavor order;
TeacupTray tt = new TeacupTray();

public void takeOrder(Tea.Flavor order) throws InterruptedException {
this.order = order;
System.out.println(name + " 这位爷您点了 " + order);
TeaStall.takeInfuseMan().takeTea(this.order, tt);
}

public Tea takeTea() {
System.out.println(name + " 茶来啦 ");
return tt.getTea();
}

public void release() {
TeaStall.releaseWaiter(this);
}

}

class TeacupTray {
private Tea tea;

public Tea getTea() {
return tea;
}

public void setTea(Tea tea) {
this.tea = tea;
}
}package local.tea;

import local.tea.Tea.Flavor;

public class InfuseMan extends TTobj {

public InfuseMan(String name) {
super(name);
}

public void takeTea(Flavor flavor, TeacupTray tt) {
tt.setTea(new Tea(flavor));
System.out.println(name + " 沏了一杯 " + flavor );
TeaStall.releaseInfuseMan(this);
}

}
package local.tea;

public class TTobj {
protected String name;

public TTobj(String name) {
this.name = this.getClass().getSimpleName() + name;
}
}
package local.tea;

public class Tea {
public static enum Flavor {
西湖龙井, 洞庭碧螺春, 白毫银针, 君山银针, 黄山毛峰, 武夷岩茶, 安溪铁观音, 信阳毛尖, 庐山云雾, 六安瓜片
}

private Flavor flavor;

public Tea(Flavor flavor) {
this.setFlavor(flavor);
}

public void setFlavor(Flavor flavor) {
this.flavor = flavor;
}

public Flavor getFlavor() {
return flavor;
}
}
package local.tea;

public class TeaClient extends TTobj implements Runnable {

Tea.Flavor favoriteFlavor = Tea.Flavor.六安瓜片;

public TeaClient(String string) {
super(string);
System.out.println(this.name + " 大驾光临");
}

public TeaClient(String name, Tea.Flavor flavor) {
this(name);
favoriteFlavor = flavor;
}

@Override
public void run() {
Tea tea = null;
Waiter waiter = null;
try {
System.out.println(name + " 小二!沏杯茶!" + favoriteFlavor);
waiter = TeaStall.takeWaiter();
waiter.takeOrder(favoriteFlavor);
tea = waiter.takeTea();
} catch (InterruptedException e) {
System.out.println(name + " 没人理我啊!我愤然离开!" + e.getStackTrace());
return;
}

System.out.println(name + " 品尝并称赞着 " + tea.getFlavor());
if (waiter != null) {
waiter.release();
}
System.out.println(name + " 我走啦~");

}

}
package local.tea;

public class TeaMenu {
Tea tea;
}
package local.tea;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TeaStall {
private static String name = "有家茶庄";
public static final int CLIENT_MAX_NUM = 5;

private static BlockingQueue<InfuseMan> infuseMen = new ArrayBlockingQueue<InfuseMan>(
1);
private static BlockingQueue<Waiter> waiters = new ArrayBlockingQueue<Waiter>(
1);

/**
* @param args
*/
public static void main(String[] args) {
waiters.add(new Waiter("【小二张】"));
infuseMen.add(new InfuseMan("【烹煮沏】"));

System.out.println(name + " 开门啦");

new Thread(new TeaClient("【梁朝伟】")).start();
new Thread(new TeaClient("【刘嘉玲】", Tea.Flavor.武夷岩茶)).start();

System.out.println(name + " 打烊啦");
}

public static Waiter takeWaiter() throws InterruptedException {
return waiters.take();
}

public static void releaseWaiter(Waiter waiter) {
waiters.add(waiter);
}

public static InfuseMan takeInfuseMan() throws InterruptedException {
return infuseMen.take();
}

public static void releaseInfuseMan(InfuseMan im) {
infuseMen.add(im);

}

}
package local.tea;

public class Waiter extends TTobj {
public Waiter(String name) {
super(name);
}

Tea.Flavor order;
TeacupTray tt = new TeacupTray();

public void takeOrder(Tea.Flavor order) throws InterruptedException {
this.order = order;
System.out.println(name + " 这位爷您点了 " + order);
TeaStall.takeInfuseMan().takeTea(this.order, tt);
}

public Tea takeTea() {
System.out.println(name + " 茶来啦 ");
return tt.getTea();
}

public void release() {
TeaStall.releaseWaiter(this);
}

}

class TeacupTray {
private Tea tea;

public Tea getTea() {
return tea;
}

public void setTea(Tea tea) {
this.tea = tea;
}
}
=========================
运行结果:
有家茶庄 开门啦
TeaClient【梁朝伟】 大驾光临
TeaClient【刘嘉玲】 大驾光临
TeaClient【梁朝伟】 小二!沏杯茶!六安瓜片
Waiter【小二张】 这位爷您点了 六安瓜片
InfuseMan【烹煮沏】 沏了一杯 六安瓜片
Waiter【小二张】 茶来啦
TeaClient【梁朝伟】 品尝并称赞着 六安瓜片
TeaClient【梁朝伟】 我走啦~
有家茶庄 打烊啦
TeaClient【刘嘉玲】 小二!沏杯茶!武夷岩茶
Waiter【小二张】 这位爷您点了 武夷岩茶
InfuseMan【烹煮沏】 沏了一杯 武夷岩茶
Waiter【小二张】 茶来啦
TeaClient【刘嘉玲】 品尝并称赞着 武夷岩茶
TeaClient【刘嘉玲】 我走啦~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-23
好像可以用工厂模式,自己看一下吧!