• 对象式
  • 对象&服务
  • 前台接待员 - 迎客、引坐、送客
Class Receptionist{}
public void receive(Customer customer);
public void usher(Customer customer);
public void send(Customer customer);
  • 服务员 - 斟茶、写菜单、上菜、换盘
Class waiter{}
public void pourTea(Customer customer);
public List<Order> write(Customer customer);
public void serve(Customer customer);//上菜
public void exchangePlate(Customer customer);
  • 收银员 - 收账、出具发票
Class Cashier{}
public void charge(Customer customer);
public void issueInvoice(Customer customer);
  • 大厨 - 烹调
Class Cook{}
public Course cook(Order order);
  • 厨工 - 食品预加工、洗碗、打扫卫生
Class KichenHand{}
public void prepareFood();
public void washDishes();
public void clean();
  • 餐馆 -
Class Restaurant{}
private Customer accept(){};//每当有顾客来访时,返回该顾客
private Customer serve(){};//为顾客提供所有的餐馆服务
public Customer service(){
	while(true)//7*24小时服务
    {
		final Customer customer;
		if (customer = accept() != null){
			serve(customer);
		}
	}
};
  • 并发式
原有的service()只能提供串行服务
// serve(customer);
new Thread(
	new Runable(){
		public void run(){
			Restaurant.this.serve(customer);
		}
	}
).start();
实际上 厨师、服务员、顾客都应该是独立的多线程处理方式
应该还有一个后台线程 服务员随时提供换盘服务、厨工随时洗盘和清洁
  • 函数式
并发式中的 Runable 匿名方法实际上是一个闭包函数,是serve方法的包装,经实例化后作为参数传入Thread的构造函数,
并且记住了外部的局部变量customer,这是customer被什么为final以保证它不被重复赋值的原因。这是一种OO化的闭包形式。
  • 事件驱动式
换盘有两种情况:一种是服务员主动换,是轮询;一种是顾客要求换,是事件驱动

客人是事件源,服务员是事件处理器,客人不定的招手呼唤是发布事件通知服务员。客人和服务员是多对多的松耦合关系。
  • 泛型式
菜式成千上万,烹饪方式相对较少,不妨以烹饪技法为主线。
如果把待加工的菜看做数据,技法看做算法,将数据与算法分离,以算法为中心
  • 逻辑式
向客人推荐菜肴的场景
可以采用规则语言来描述 餐馆的菜式、顾客的口味、忌讳,以及各种菜与口味、忌讳之间的关系。
通过规则引擎来导出符合顾客需求的菜肴。
  • 切面式
餐馆一般还有一些礼貌规范 和 卫生标准,如果餐馆对礼貌规范和卫生标准做修改
可以创建两个Aspect,分别负责礼貌规范和卫生标准方面的事务