zoukankan      html  css  js  c++  java
  • 设计模式之策略模式 Strategy

    代码实现

    public interface Strategy {
    
        public double getPrice(double standardPrice);
    }
    Strategy 接口
    public class NewCustomerFewStrategy implements Strategy{
    
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("不打折,原价");
            return standardPrice;
        }
    
    }
    
    public class NewCustomerManyStrategy implements Strategy{
    
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("打九折");
            return standardPrice*0.9;
        }
    
    }
    
    
    public class OldCustomerFewStrategy implements Strategy{
    
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("打八五折");
            return standardPrice*0.85;
        }
    
    }
    
    public class OldCustomerManyStrategy implements Strategy{
    
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("打八折");
            return standardPrice*0.8;
        }
    
    }
    Strategy的不同实现
    /**
     * 负责和具体的策略类交互
     * 这样的话,具体的算法和直接的客户端分离,
     * 如果使用spring的依赖注入功能,可以通过配置文件,动态的注入不同的策略对象,动态的切换不同的算法
     * @author bzhx
     * 2017年3月15日
     */
    public class Context {
    
        private Strategy strategy; //当前采用的算法对象
    
        //通过构造器注入
        public Context(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
    
        //通过set方法注入
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
        
        public void printPrice(double s){
            System.out.println("您的报价是:"+strategy.getPrice(s));
        }
        
    }
    Context 类
    public class TestStrategy {
        /**
         * 实现起来容易,
         * 但是类型比较多,逻辑比较复杂的时候,代码变得比较复杂,难以维护
         * 如果有新增类型,就需要频繁的修改此处代码
         * 不符合 开闭原则
         * @param type
         * @param price
         * @return
         */
    
        public double getPrice(String type,double price){
            if(type.equals("普通客户小批量")){
                System.out.println("不打折,原价");
                return price;
            }else if(type.equals("普通客户大批量")){
                System.out.println("打九折");
                return price*0.9;
            }else if(type.equals("老客户小批量")){
                System.out.println("打八五折");
                return price*0.85;
            }else if(type.equals("老客户大批量")){
                System.out.println("打八折");
                return price*0.8;
            }
            
            return price;
        }
    }
    普通调用
    public class Client {
    
        public static void main(String[] args) {
            Strategy s1 = new OldCustomerManyStrategy();
            Context ctx = new Context(s1);
            
            ctx.printPrice(100);
        }
    }
    使用策略模式调用

     

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/qingdaofu/p/7478133.html
Copyright © 2011-2022 走看看