ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图解设计模式(11) 策略模式

2019-09-04 19:04:02  阅读:238  来源: 互联网

标签:11 图解 double Strategy strategy originalPrice 设计模式 public getPrice


一、 应用场景

    商场对于不同的客户采用不同的打折策略;

    施工对于不同的地形地貌采用不同的施工方法;数据处理针对不同批量的数据选取不同的算法等。

    对于常用的

    if() {

    }else if(){

    }else if(){

    }else{}

    结构,可以采用策略模式来重构。 当增加新的模式时,不需要修改原有的代码,符合开闭原则。

    它可以算法与架构分离。

 

二、具体实现

  •     实现要点

1. 一个Strategy interface, 在其中定义要实现的方法。

2. 多个具体的Strategy类,implements interface, 在其中实现不同的算法。

3.一个上下文类 Context, 其中包含Strategy 对象,可以选择不同的具体策略类来处理业务。

  •     代码实现

以超市打折策略为例,新客户买的少不打折;新客户买的多打9折;老客户买的少打9折;老客户买的多打8折。

 1. Strategy接口,规定要实现的方法。

public interface Strategy {
    double getPrice(double originalPrice);
}

2. 不同的策略, implements interface

public class NewCustomerFew implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("新客户买的少不打折!");
        return originalPrice;
    }
}

class NewCustomerMany implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("新客户买的多打九折!");
        return originalPrice * 0.9;
    }
}

class OldCustomerFew implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("老客户买的少打九折!");
        return originalPrice * 0.9;
    }
}

class OldCustomerMany implements Strategy {

    @Override
    public double getPrice(double originalPrice) {
        System.out.println("老客户买的多打八折!");
        return originalPrice * 0.8;
    }
}

3. 上下文类,包含有策略的对象。

public class Context {
    private Strategy strategy;

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

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public double getPrice(double originalPrice){
        return this.strategy.getPrice(originalPrice);
    }
}

测试类

public class ClientTest {

    public static void main(String[] args) {
        Context context = new Context(new NewCustomerFew()); //新客户买的少
        System.out.println(context.getPrice(100));
        
        context.setStrategy(new OldCustomerMany());  //老客户买的多
        System.out.println(context.getPrice(999));
    }
}

测试结果

标签:11,图解,double,Strategy,strategy,originalPrice,设计模式,public,getPrice
来源: https://blog.csdn.net/gongxing12/article/details/100178974

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有