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

    策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具体的共同接口的独立类中,从而使得他们可以互相替换。

    策略模式使得算法可以在不影响客户端的情况下发生变化。

    all in one “准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

    三个角色:

    环境context角色:持有一个Strategy的引用

    策略接口角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

    策略角色:包装了相关的算法或行为

    环境角色:

    package com.yzf.pattern.strategy;
    
    /**
     * 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
     * 在每一个时刻只能使用一个具体的策略实现对象
     * @author luozuzu
     *
     */
    public class Price {
        //持有一个具体的策略对象
        private MemberStrategy memberStrategy;
        
        /**
         * 构造函数,传入一个具体的策略对象
         * @param memberStrategy
         */
        public Price( MemberStrategy memberStrategy){
            this.memberStrategy = memberStrategy;
        }
        
        public double quote(double price){
            return this.memberStrategy.calcPrice(price);
        }
    }

    接口类:

    package com.yzf.pattern.strategy;
    
    //策略接口
    public interface MemberStrategy {
        public double calcPrice(double price);
    }

    策略实现类

    package com.yzf.pattern.strategy;
    
    public class FirstMemberStrategy implements MemberStrategy {
        
        //具体策略算法1
        public double calcPrice(double price) {
             
            System.out.println("对于初级会员的没有折扣");
            
            return price;
        }
    
    }
    package com.yzf.pattern.strategy;
    
    public class SecondMemberStrategy implements MemberStrategy {
        //具体策略算法2
        public double calcPrice(double price) {
            System.out.println("对于中级会员的折扣为10%");
            return price * 0.9;
        }
    
    }
    package com.yzf.pattern.strategy;
    
    public class ThirdMemberStrategy  implements MemberStrategy {
        
        //具体策略算法3
        public double calcPrice(double price) {
             System.out.println("对于高级会员的折扣为20%");
             return price * 0.8;
        }
    }

    客户端

    package com.yzf.pattern.strategy;
    
    public class Client {
    
        public static void main(String[] args) {
            //MemberStrategy ms = new FirstMemberStrategy();
            
            //MemberStrategy ms = new FirstMemberStrategy();
            
            MemberStrategy ms = new SecondMemberStrategy();
            Price p = new Price(ms);
            double quote = p.quote(300);
            System.out.println(quote);
        }
    
    }

      策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

  • 相关阅读:
    什么是 HTTPS
    首页飘雪的效果
    load data导入数据之csv的用法
    phpcms v9 配置sphinx全文索引教程
    js的一些技巧总结
    MySQL 清除表空间碎片
    使用的前台开发在线工具
    (phpQuery)对网站产品信息采集代码的优化
    永远不要打探别人工资
    git 显示多个url地址推送
  • 原文地址:https://www.cnblogs.com/yaoyiyao/p/7212389.html
Copyright © 2011-2022 走看看