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方法,控制台输出如下,实现了不同算法间的切换

  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/jerry19890622/p/4197305.html
Copyright © 2011-2022 走看看