项目中用到4种设计模式,分别是:抽象工厂模式,简单工厂模式,策略模式和观察者模式。
抽象工厂是用于餐馆顾客点套餐使用的,将套餐包含的食物看做是一个产品族;
简单工厂是用来给顾客单独点单使用;
策略模式是结账是是否有优惠来计算最后总额;
观察者模式中服务员是观察者,顾客点单动作是观察目标,服务员根据顾客点单来做出相应动作。
就餐系统功能是排队候餐,点单,结账优惠选择三个功能。
排队候餐是利用随机函数产生一个整型数字充当当前排队序号。利用程序睡眠来产生等候时间。
点单分为套餐和单点,选完套餐后也可以以继续单点。其中套餐是食物固定,份额固定。单点则没有要求,可以点任意菜,每种菜任意数量。
结账优惠中有三种优惠方式,分为无优惠、有优惠券和有折扣券。
抽象工厂一共包含四个元素:抽象工厂,具体工厂,抽象产品和具体产品。
项目中,menu01充当抽象工厂角色,声明了一个套餐的菜品族接口,具体实现放到具体工厂FoodFactory01中。具体工厂每一个方法用来返回实现了接口什申明的菜品。
BaseFood充当抽象食品接口,里面有每样食物的基本属性包括菜名、价格、数量。BaseFood还继承类Price以及实现接口PriceCalculate,PrintFoodMessage,以便于在具体食物产品中根据顾客点的菜品以及数量来计算总费用和输出菜品信息到账单上。简要代码如下:
public interface Menu01 { BeerDuck createBeerDuck(int num); SweetPork createSweetPork(int num); RicePork createRicePork(int num); EggSoup creatEggSoup(int num); } public class FoodFactory01 implements Menu01{ @Override public SweetPork createSweetPork(int num) { return new SweetPork(num); } ... } public class BaseFood extends Price implements PriceCalculate,PrintFoodMessage{ //接口的多继承 public String kind; public int num; public float price; @Override public void calculatePrice(float foodprice) { this.pricecount +=foodprice; } .... } public class BeerDuck extends BaseFood { public BeerDuck(int num) { this.kind = "啤酒鸭"; this.price = 30.0f; this.num = num; calculatePrice(this.num * this.price); printMessage(); } } 简单工厂包括工厂角色,抽象产品角色和具体产品角色三个元素。其中抽象产品角色同抽象工厂所用的抽象产品角色是同一个。
工厂角色是FoodFactory02,负责实现生产所有菜品的实例,简单工厂下的方法可以直接被服务员直接调用来生产顾客下单的菜品。简要代码如下:
public class FoodFactory02 { public BaseFood createBeijingDuck(int num) { return new BeijingDuck(num); } .... } 策略模式包括环境类,抽象策略类和具体策略类。
其中PriceStrategy充当抽象策略接口,定义获得总价的抽象方法。
Context充当环境类并继承Price类,Price中存放总价格。环境类中定义抽象策略类的实例,构造函数将服务员传入的策略赋给具体策略类。还有打折后总价的方法getDisPrice(),根据策略类型返回打折后的价格。
Coupon和Discount冲动具体策略类,分别是优惠券类型和折扣类型。
简要代码如下:
public interface PriceStrategy { public float getprice(float finalprice); } public class Context extends Price { private PriceStrategy strategy; public Context(PriceStrategy strategy) { this.strategy = strategy; } public float getDisPrice(float finalprice) { pricecount = strategy.getprice(finalprice); return pricecount; } } public class Coupon implements PriceStrategy { @Override public float getprice(float finalprice) { return finalprice-30; } } .... 观察者模式中包括目抽象目标,具体目标,抽象观察者和具体观察者。但本项目用到的观察者模式不是很完整,因为这有服务员和顾客,所以抽象类都省略了,直接把顾客当做具体目标,服务员当做具体观察者,顾客所要做的就是根据选项点菜,而服务员根据顾客选择的结果,调用相应的方法应对。简要代码如下:
public class Client { public static void main(String[] args) throws InterruptedException { ...... Scanner in = new Scanner(System.in); Waiter waiter = new Waiter(in.nextInt()); } }throws InterruptedException { … Scanner in = new Scanner(System.in); Waiter waiter = new Waiter(in.nextInt()); } }