当需要多种变化组合时,多种商品组合在一起,同时针对节假日、老客户有不同的优惠;面对这种需求,如果使用工厂模式可能出现模式较死板,不能灵活应对各种组合,此时可以考虑使用建造者模式。
//商品种类
public interface Fruit {
int getPrice();
void setPrice(int price);
}
public class Apple implements Fruit {
private int price;
@Override
public int getPrice() {
return price;
}
@Override
public void setPrice(int price) {
this.price = price;
}
}
public class Banana implements Fruit {
private int price;
@Override
public int getPrice() {
return price;
}
@Override
public void setPrice(int price) {
this.price = price;
}
}
public class Orange implements Fruit {
private int price;
@Override
public int getPrice() {
return price;
}
@Override
public void setPrice(int price) {
this.price = price;
}
}
//建立组合套餐
public class FruitMeal {
private Apple apple;
private Banana banana;
private Orange orange;
private int discount; //折扣价
private int totalPrice;
public void setApple(Apple apple) {
this.apple = apple;
}
public void setBanana(Banana banana) {
this.banana = banana;
}
public void setOrange(Orange orange) {
this.orange = orange;
}
public void setDiscount(int discount) {
this.discount = discount;
}
public int cost() {
return totalPrice;
}
public void init() {
if (null != apple){
totalPrice += apple.getPrice();
}
if (null != orange){
totalPrice += orange.getPrice();
}
if (null != banana){
totalPrice += banana.getPrice();
}
if (totalPrice > 0){
totalPrice -= discount;
}
}
public void showItems() {
System.out.println("TotalPrice: " + this.totalPrice);
}
}
//建造者接口
public interface Builder {
void buildApple(int price);
void buildBanana(int price);
void buildOrange(int price);
FruitMeal getFruitMeal();
}
//针对不同的客户封装不同的建造者
public class HolidayBuilder implements Builder{
private FruitMeal fruitMeal = new FruitMeal();
@Override
public void buildApple(int price) {
Apple apple = new Apple();
apple.setPrice(price);
fruitMeal.setApple(apple);
}
@Override
public void buildBanana(int price) {
Banana banana = new Banana();
banana.setPrice(price);
fruitMeal.setBanana(banana);
}
@Override
public void buildOrange(int price) {
Orange orange = new Orange();
orange.setPrice(price);
fruitMeal.setOrange(orange);
}
@Override
public FruitMeal getFruitMeal() {
fruitMeal.setDiscount(15); //设置折扣价
fruitMeal.init();
return fruitMeal;
}
}
public class OldCustomerBuilder implements Builder {
private FruitMeal fruitMeal = new FruitMeal();
@Override
public void buildApple(int price) {
Apple apple = new Apple();
apple.setPrice(price);
fruitMeal.setApple(apple);
}
@Override
public void buildBanana(int price) {
Banana banana = new Banana();
banana.setPrice(price);
fruitMeal.setBanana(banana);
}
@Override
public void buildOrange(int price) {
Orange orange = new Orange();
orange.setPrice(price);
fruitMeal.setOrange(orange);
}
@Override
public FruitMeal getFruitMeal() {
fruitMeal.setDiscount(10); //设置折扣
fruitMeal.init();
return fruitMeal;
}
}
//建造者模式下,都是为controller服务
public class HolidayController {
public static void main(String[] args) {
HolidayBuilder builder = new HolidayBuilder();
builder.buildApple(100);
builder.buildBanana(50);
builder.buildOrange(30);
FruitMeal fruitMeal = builder.getFruitMeal();
fruitMeal.showItems();
}
}