现在水果店不断扩展支付方式,但是不想影响主流程
![](https://img.haomeiwen.com/i11851909/cb4589738887a9eb.png)
模板方法模式
![](https://img.haomeiwen.com/i11851909/47b930ffb1af77de.png)
对于未知的方法,在主流程中,使用抽象方法代替,具体实现,在具体使用的时候就知道了
/**
* 模板方法模式
* 购物车费用结算过程
*/
public abstract class ShoppingCart {
private Discount discount;
private List<Fruit> products = new ArrayList<>();
public ShoppingCart(List<Fruit> products){
this.products = products;
}
public void setDiscount(Discount discount) {
this.discount = discount;
}
//提交订单主流程
public void submitOrder(){
//计算商品金额
int money = balance();
System.out.println("商品总金额为:"+money+"元");
//优惠减免
money = discount.calculate(money);
System.out.println("优惠减免后:"+ money+"元,");
//保存订单
pay(money);
//送货上门
sendHome();
}
//计算金额
private int balance(){
int money = 0;
System.out.print("商品清单:");
for (Fruit fruit : products){
fruit.draw();
System.out.print(",");
money += fruit.price();
}
return money;
}
private void sendHome(){
System.out.println("三公里以内,免费送货上门");
}
//提交保存
protected abstract void pay(int money);
}
在主流程中,pay方法是未知的,需要子类实现它,这样利用Java多态的特性,不影响主流程并且能够方便扩展新的实现功能
/**
* 模板方法模式
* 购物车费用结算过程
*/
public class OtherPayShopping extends ShoppingCart{
public OtherPayShopping(List<Fruit> products) {
super(products);
}
@Override
protected void pay(int money) {
System.out.println("代付成功");
}
}
/**
* 模板方法模式
* 订单费用结算过程
*/
public class ShoppingCartClient {
public static void main(String[] args) {
List<Fruit> products = new ArrayList();
products.add(StaticFactory.getFruitApple());
products.add(StaticFactory.getFruitBanana());
products.add(StaticFactory.getFruitOrange());
ShoppingCart cart = new OtherPayShopping(products);
//注入优惠方案
// String discount = "second";
// cart.setDiscount(disCounts.get(discount));
cart.submitOrder();
}
}
![](https://img.haomeiwen.com/i11851909/2b76db8682c826f3.png)
适用场景
定义好主业务流程后,子模块暂时不知道具体的实现
总结
利用Java多态的特性来实现,并且也体现了开闭原则
网友评论