策略模式

2018-10-19  本文已影响0人  囧略囧

策略模式——定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

何时使用:一个系统有许多子类,而区分它们的只是它们的行为

如何解决:将这些算法封装成一个个的类,可相互替换

关键代码:实现同一个接口

image

该模式涉及三个角色:

1、环境角色(Context):使用了某种策略的类

2、抽象策略角色(Strategy):通常由一个接口或抽象类实现,包含多种策略所需的接口

3、具体策略角色(ConcretStrategyA,……):实现相关的算法或行为

我们通过代码来具体实现一个策略模式,假设一家饭店的顾客分为普通顾客,vip顾客和svip顾客,就餐时分别享受原价,九折和八折优惠。

1、环境角色

public class Customer {

    private float foodPrice;
    private Strategy strategy;

    public float callLastAmount() {
        return strategy.getMealFee(foodPrice);
    }

    public void setFoodPrice(float foodPrice) {
        this.foodPrice = foodPrice;
    }
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}

2、抽象策略角色

public interface Strategy {
    float getMealFee(float mealFee);
}

3、具体策略角色

public class CommonStrategy implements Strategy {
    @Override
    public float getMealFee(float mealFee) {
        return mealFee;
    }
}
public class VipStrategy implements Strategy {
    @Override
    public float getMealFee(float mealFee) {
        return (float) (mealFee * 0.9);
    }
}
public class SvipStrategy implements Strategy {
    @Override
    public float getMealFee(float mealFee) {
        return (float) (mealFee * 0.8);
    }
}

三名不同身份的顾客来就餐,折前餐费均为100元,现在查看当Contex的Strategy变化时的结果

public class Run {
    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.setFoodPrice(100);

        customer.setStrategy(new CommonStrategy());
        System.out.println(customer.callLastAmount());

        customer.setStrategy(new VipStrategy());
        System.out.println(customer.callLastAmount());

        customer.setStrategy(new SvipStrategy());
        System.out.println(customer.callLastAmount());
    }
}

输出:

100.0
90.0
80.0
上一篇下一篇

猜你喜欢

热点阅读