Java设计模式学习-策略模式

如下使用场景:

  • 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
  • 1),普通客户小批量报价
  • 2),普通用户大批量报价
  • 3),老客户小批量报价
  • 4),老客户大批量报价

要实现以上的报价系统,一般程序员都会想到这样来做,如下

 

/**未使用策略模式
 * @author 晓电脑
 * 缺点: 违反了java的开闭原则
 * 如果需要修改打折方法都需要修改getPrice()方法 后期难于维护
 */
public class NoStrategyTest {
    public static void main (String[] args) {
            String user="老客户小批量";
        NoStrategyTest strategyTest = new NoStrategyTest();
        double price = strategyTest.getPrice(user, 500);
        System.out.println(price);
    }

    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.95;
        }else if (type.equals("老客户大批量")){
            System.out.println("打八五折");
            return price*0.85;
        }
        return price;
    }
}

 

策略模式:

  • 策略模式对应于解决,某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一个问题 , 同时可以方便的更换算法或者增加新的算法 。并且客户端决定调用哪个算法。

1),创建算法抽象类接口

/**价格接口类
 * @author 晓电脑
 */
public interface Strategy {

    double getPrice(double  price);
}

2),创建新客户小批量类继承与价格接口类

/** 新客户小批量
 * @author 晓电脑
 */
public class NewCoustomerSmallStrategy  implements Strategy{

    @Override
    public double getPrice(double price) {
        System.out.println("不打折");
        return price;
    }
}

 

3),创建新客户大批量客户类,继承与价格类接口

/** 新客户大批量
 * @author 晓电脑
 */
public class NewCoustomerManyStrategy implements Strategy{

    @Override
    public double getPrice(double price) {
        System.out.println("打九折");
        return price*0.9;
    }
}

 

4),创建老客户小批量价格类 ,继承与价格类

/** 老客户小批量
 * @author 晓电脑
 */

public class OldCoustomerSmallStrategy implements Strategy{

    @Override
    public double getPrice(double price) {
        System.out.println("打九五折");
        return price*0.95;
    }
}

 

5),创建老客户大批量价格处理类 , 继承与价格类

/** 老客户小批量
 * @author 晓电脑
 */
public class OldCoustomerManyStrategy implements Strategy{

    @Override
    public double getPrice(double price) {
        System.out.println("打八五折");
        return price*0.85;
    }
}

 

6),创建与策略类交互的类Context

/**负责和具体策略类交互的类
 * @author 晓电脑
 */
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public double printPrice(double price){
        /**
         * 调用接口实现类的方法
         */
        return strategy.getPrice(price);
    }
}

 

7),创建客户端进行测试

/**测试策略模式
 * @author 晓电脑
 */
public class Client {
    public static void main (String[] args) {
        //创建老客户大批量的类进行处理价格
        OldCoustomerManyStrategy manyStrategy = new OldCoustomerManyStrategy();
        //传入老客户大批量类
        Context context = new Context(manyStrategy);
        //的到打折后的价格
        double printPrice = context.printPrice(5000);
        System.out.println(printPrice);
    }
}

 

运行结果

 

策略模式本质是: 分离算法 , 选择实现

开发中常见的场景:

  • JavaSE中GUI编程中 ,布局管理
  • Spring框架中 ,Resource接口,资源访问策略
  •  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值