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

    场景引入:

      小镇的咖啡馆生意越来越好了,但是来自不同地方的顾客也越来越多,有的人喜欢咖啡加糖,有的人喜欢咖啡加牛奶,有的喜欢加炼乳。。。

    咖啡伪代码:

    class 咖啡{
    
        void addSth(String param){
              if(param.equals("糖")){
                  System.out.println("咖啡加糖。。。。");
               }else if(param.equals("牛奶")){
                   System.out.println("咖啡牛奶。。。。");
               }       
        }
    
    }                    

    每次出一种新品种,都要在if..else if..后添加,违反了对开闭原则的,对修改关闭的原则。

    我们可以尝试以下策略模式来解决这个问题。

    1.声明一个策略接口;

    2.往后只要新增加一种口味,都生成一种新的具体策略实现类;

    3.在生成咖啡时,将具体的策略赋值给咖啡,就可以生成不同口味的咖啡啦!

    是不是听起来很棒,那我们来看一下具体的代码实现吧

    代码展示:

    策略接口:

    //策略接口
    interface Strategy{
        void add();
    }

    加糖策略:

    //加糖策略
    class SugarStrategy implements Strategy{
        public void add(){
            System.out.println("add Sugar....");
        }
    }

    加牛奶策略:

    //加牛奶策略
    class MilkStrategy implements Strategy{
        public void add(){
            System.out.println("add Milk....");
        }
    }

    具体的咖啡接收类:

    class Coffee{
        //策略
        private Strategy strategy;
        
        public void setStrategy(Strategy strategy){
            this.strategy=strategy;
        }
        
         //烧水
        private void boilWater(){
            System.out.println("boil water...");
        }
        //煮咖啡
        void cook(){
          System.out.println("cook coffee....");  
        }
        //倒咖啡到杯子中
        private void dumpWater(){
            System.out.println("dump water into cup...");
        }
        
        public void doSth(){
            boilWater();
            cook();
            dumpWater();
            if(strategy != null){
                strategy.add();
            }
        }
    }

    测试类:

    //测试类
    public class Test{    
        public static void main(String[] args){  
            Strategy strategy = new MilkStrategy();
            Coffee coffee = new Coffee();
            coffee.setStrategy(strategy);
            coffee.doSth();
            System.out.println("============================");
            strategy = new SugarStrategy();
            coffee.setStrategy(strategy);
            coffee.doSth();
        }
    }
    View Code

    测试结果:

  • 相关阅读:
    腾讯测试开发岗一面二面上机编程题
    软件测试工程师职业发展漫谈
    学习 Python,这 22 个包怎能不掌握?
    Loj514「LibreOJ β Round #2」模拟只会猜题意
    后缀数组模板(倍增)
    USACO06DEC 牛奶模式
    BZOJ3680 JSOI2004 平衡点
    loj6278 数列分块入门题2
    loj6277 数列分块入门题1
    Codeforces 383C Propagating tree, 线段树, 黑白染色思想
  • 原文地址:https://www.cnblogs.com/zjting/p/11393927.html
Copyright © 2011-2022 走看看