• 设计模式之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);
        }
    
    }

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

  • 相关阅读:
    北漂开始
    iOS沙盒简单介绍
    iOS多线程技术
    使用Redis实现分布式锁
    Spring Cloud构建微服务架构(六)高可用服务注册中心
    springboot学习之maven多环境打包的几种方式
    数据库中in和exists关键字的区别
    Java 中的悲观锁和乐观锁的实现
    springboot学习笔记-5 springboot整合shiro
    spring 整合 redis,以及spring的RedisTemplate如何使用
  • 原文地址:https://www.cnblogs.com/yaoyiyao/p/7212389.html
Copyright © 2020-2023  润新知