策略模式



一、策略模式:
  如果说简单工厂模式对对象分类,
  那么策略模式就是对相似逻辑算法分类,
  将算法的切换变成一个目标可变的行为,
  由策略决定行为。

二、基本思路:
  1.创建策略抽象类,定义所有支持的算法的公共接口;
  2.继承抽象类,策略具体化;
  3.定义Context类作为上下文承接的角色,是使用了某种策略的类,通过策略改变自身行为。

三、简单样例:
  以简单收银软件为例,灵活解决原价、打折、返现、返积分等问题。
/**
 * 策略抽象类
 * 定义收费抽象方法
 */
 abstract class CashSuper{
    public abstract double acceptCash(double money);
}
/**
 * 具体策略的实现
 * 将收费方式具体化,例如按照原价,或者打折或者满价返现等等
 */
//正常收费
class CashNormal extends CashSuper{
    @Override
    public double acceptCash(double money) {
        return money;
    }
}

//打折收费
class CashRebate extends CashSuper{
     private double cashRebate=1;
     CashRebate(double moneyRebate){//传入折扣率,之前初始化为1
         this.cashRebate=moneyRebate;
     }

    @Override
    public double acceptCash(double money) {
        return money*cashRebate;//折扣后
    }
}

//收费返利
class CashReturn extends CashSuper{
     private double cashCondition=0;
     private double cashReturn=0;

     //满cashCondition,送cashReturn
     CashReturn(double cashCondition, double cashReturn){
         this.cashCondition=cashCondition;
         this.cashReturn=cashReturn;
     }

    @Override
    public double acceptCash(double money) {
         double result=money;
         if (money>=cashCondition){
             result=money-Math.floor(money/cashCondition)*cashReturn;
         }
        return result;
    }
}
/**
 * 接收具体策略,并产生不同的行为
 * 根据收费策略,决定费用计算方法
 */
class Context{
    private CashSuper cashSuper;

    //通过构造方法传入具体的收费策略
    public Context(CashSuper cashSuper){
        this.cashSuper=cashSuper;
    }

    public double getResult(double price){
        //根据收费策略的不同,用不同的计算方法获得具体收费金额。
        return cashSuper.acceptCash(price);
    }
}
/**
 * 选择策略
 * 客户端选择收费方法,即可得到响应的结果,
 * 具体算法已经跟客户程序隔离
 */
class Main{

    public static Context chooseStrategy(String type){
        Context context=null;
        //根据收费类型不同,将相应的策略对象传入Context中,
        // 之后Context将产生对应行为,最终得出结果
        switch (type) {
            case "正常收费":
                context = new Context(new CashNormal());
                break;
            case "打8折":
                context = new Context(new CashRebate(0.8));
                break;
            case "满300返100":
                context = new Context(new CashReturn(300, 100));
                break;
            default:
                break;
        }
        return context;
    }
    public static void main(String[] args) {
        double single=12;//单价
        double num=3;//数量
        double totalPrice=0;//总价

        Context context=null;
        String[] types={"正常收费","打8折","满300返100"};
        context=chooseStrategy(types[1]);

        //进行计算
        totalPrice=context.getResult(single*num);
        System.out.println("应收费:"+totalPrice);
    }
}

 

全部评论

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务