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

    1. 定义

      它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响使用算法的客户。

    2. 类图

       

      Strategy定义所有算法的公共接口

    public interface Strategy {
           public void algorithmInterface();
    }

      具体算法实现,定义了三种算法,分别为ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC

    public class ConcreteStrategyA implements Strategy {
       public void algorithmInterface() {
            //算法A     
       }    
    }
    
    
    public class ConcreteStrategyB implements Strategy {
       public void algorithmInterface() {
            //算法B     
       }    
    }
    
    
    public class ConcreteStrategyC implements Strategy {
       public void algorithmInterface() {
            //算法C     
       }    
    }

      上下文包含一个Strategy具体策略对象

    public class Context {
          private Strategy strategy;
    
          public Context(Strategy strategy) {
                 this.strategy = strategy;
          }
    
          public void contextInterface() {
                this.strategy.algorithmInterface(); 
         }    
    }

     3.使用策略模式实现针对不同顾客报价小列子

    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:44:31
     */
    public interface Strategy {
        double calcPrice(double price);
    }
    
    
    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:46:04
     */
    public class NormalCustomerStrategy implements Strategy{
    
        @Override
        public double calcPrice(double price) {
            // TODO Auto-generated method stub
            System.out.println("对于新顾客或普通顾客,没有折扣");
            return price;
        }
    
    }
    
    
    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:49:00
     */
    public class OldCustomerStrategy implements Strategy{
    
        @Override
        public double calcPrice(double price) {
            // TODO Auto-generated method stub
            System.out.println("对于老顾客,打5%折扣");
            return price * (1 - 0.05);
        }
    
    }
    
    
    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:50:27
     */
    public class VipStrategy implements Strategy{
    
        @Override
        public double calcPrice(double price) {
            // TODO Auto-generated method stub
            System.out.println("对于VIP顾客,打10%折扣");
            return price * (1 - 0.1);
        }
    
    }
    
    
    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:51:22
     */
    public class Context {
        private Strategy strategy;
        
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
        
        public double quote(double price) {
            return this.strategy.calcPrice(price);
        }
    }
    
    
    package com.jerry.designpattern;
    /**
     * 
     * @author Jerry
     * @date 2015年1月1日 下午10:53:04
     */
    public class Client {
        public static void main(String[] args) {
            Context context = new Context();
            Strategy normal = new NormalCustomerStrategy();
            context.setStrategy(normal);
            System.out.println("报价为:" + context.quote(1000));
            
            Strategy old = new OldCustomerStrategy();
            context.setStrategy(old);
            System.out.println("报价为:" + context.quote(1000));
            
            Strategy vip = new VipStrategy();
            context.setStrategy(vip);
            System.out.println("报价为:" + context.quote(1000));
        }
    }

    执行main方法,控制台输出如下,实现了不同算法间的切换

  • 相关阅读:
    关于document.onkeydown
    kubernetes PV存储卷类型 Marathon
    0015leetcode算法实现之三数之和3sumpython&golang实现 Marathon
    0018leetcode算法实现之四数之和4sumpython&golang实现 Marathon
    ubuntu20.04调整时区时间同步 Marathon
    0054leetcode算法实现之螺旋矩阵spiralMatrixpython&golang实现 Marathon
    0005剑指offer替换空格python&golang实现 Marathon
    使用 kubectl 管理 Secret Marathon
    0058leetcode算法实现之左翻转字符串reverseLeftStringpython%golang实现 Marathon
    0059leetcode算法实现之螺旋矩阵IIspiralMatrixIIpython&golang实现 Marathon
  • 原文地址:https://www.cnblogs.com/jerry19890622/p/4197305.html
Copyright © 2011-2022 走看看