设计模式-策略模式详解

一、引言

在讲策略模式之前,我们来看零售行业软件的一个针对客户类型打折的功能。

vip客户打八折,svip客户打七折。

代码实现:

 if (customer == "vip")
 {
       amount = amount * 0.8;
 }
 else if (customer == "svip")
 {
       amount = amount * 0.7;
 }

看代码,挺简单的,但是如果今天vip打八折,明天要打7折,那还得改变原有的代码,这样就违背了开闭原则。这里变化的是折扣的计算方式(策略),策略模式就可以解决这类问题。

二、概念

策略模式是一种对象行为型模式。策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。

三、实现

策略模式包含三种角色:Context: 上下文类、Strategy: 抽象策略类、ConcreteStrategy: 具体策略类

抽象策略类:

    public abstract class AbstractDiscountStrategy
    {
        public abstract decimal Discount(decimal amount);
    }

具体策略类:

    public class VipDiscountStrategy:AbstractDiscountStrategy
    {
        public override decimal Discount(decimal amount)
        {
            return amount * 0.8M;
        }
    }
    public class SVipDiscountStrategy:AbstractDiscountStrategy
    {
        public override decimal Discount(decimal amount)
        {
            return amount * 0.7M;
        }
    }

环境类:

   public class StrategyContext
    {
        private AbstractDiscountStrategy discountStrategy;

        public StrategyContext(AbstractDiscountStrategy concreteDiscountStrategy)
        {
            this.discountStrategy = concreteDiscountStrategy;
        }

        public decimal ExecuteStrategy(decimal amount)
        {
            return this.discountStrategy.Discount(amount);
        }
    }

调用:

 if (customer == "vip")
            {
                context = new StrategyContext(new VipDiscountStrategy());
                amount = context.ExecuteStrategy(amount);
            }
            else if (customer == "svip")
            {
                context = new StrategyContext(new SVipDiscountStrategy());
                amount = context.ExecuteStrategy(amount);
            }

可以看到,应用策略模式后,如果要修改vip客户的折扣计算方式,只需要修改对应的策略即可,不需要修改客户端的调用代码,也不会影响到svip的折扣计算方式,符合开闭原则。

再来一个ssvip客户,只需要增加一个对应的策略实现类,并且修改客户端的调用方法即可。

vip和svip的策略可以互换。

四、总结

从上面的例子可以看出来,策略模式的优点是提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

缺点也很明显,客户端必须清楚知道每一个策略的用途,并且自行决定使用哪一个策略,增加了客户端的负担,这个问题可以使用配置的方式来解决。每一个策略都需要一个类,会使策略类增多。

代码下载:https://github.com/hzhhhbb/StrategyPattern

原文地址:https://www.cnblogs.com/hzhhhbb/p/11538083.html

时间: 2024-10-11 10:06:51

设计模式-策略模式详解的相关文章

设计模式中的多态——策略模式详解

目录 1. 关于策略模式 2. 策略模式详解 2.1 策略模式定义 2.2 策略模式的UML类图 3.策略模式的优点 3.1 一个使用策略模式的例子 3.2 与其他实现方式的对比 3.3 使用策略模式的优点 4. 使用工厂方法模式改进原有策略模式 5. 总结 5. 参考资料 1. 关于策略模式 策略模式和java语言的多态特性有些像.java的多态特性允许我们面向接口编程,不用关心接口的具体实现.接口所指向的实现类,以及通过接口调用的方法的具体行为可以到运行时才绑定.这么做最大的好处是在尽可能实

【设计模式】策略模式详解

前言 学习设计模式已经有一段时间了,前段时间一直在忙一个安卓的app,没时间更新.今天有点空,本着开源的精神,把策略模式的一些东西分享一下. 注意:博主只是个搞安卓的大三学生狗,以下内容纯属自学的,若有不正确的地方欢迎指出. 正文 转载请注明出处: http://blog.csdn.net/h28496/article/details/46403815 发 表 时 间: 2015年6月7日 作 者 信 息: 中北大学 郑海鹏 举例说明为什么要有策略模式 假设一个场景:我们有一些排序算法,需要观察

(七)策略模式详解

上章我们着重讲解了观察者模式和事件驱动,那么本章来讨论一个个人认为在开发过程中出场率极高的设计模式,策略模式. 策略模式在LZ第一次接触到的时候,LZ是这么理解的,就是如果我们想往一个方法当中插入随便一段代码的话,就是策略模式.即如下形式. [java] view plaincopy <EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pl

JS设计模式——工厂模式详解

工厂模式是另外一种关注对象创建概念的创建模式.它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常为单体)来生成实例 复杂工厂模式:使用子类来决定一个变量成员应该为哪个具体的类的实例. 简单工厂模式 var BicycleShop = function () { }; BicycleShop.prototype = { sellBicycle: fu

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

二、设计模式总览及工厂模式详解

二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场景. 2.2.内容定位 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的 是解耦.设计模式天天都在用,但自己却无感知.我们把设计模式作为一个专题,主要是学习设计模式 是如何总结经验的,把经验为自己所用.学设计模式也是锻炼将业务需求转换技术实现的一种非常有效 的方

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦