美文网首页
策略模式

策略模式

作者: 囧略囧 | 来源:发表于2018-10-19 16:48 被阅读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
    

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/enpeoftx.html