24_C#设计模式-策略模式

Design Patterns

策略模式

刘 伟 (Sunny)\rweiliu_china@126.com

大纲

\r

策略模式概述\r策略模式的结构与实现\r策略模式的应用实例\rPetShop 4.0中的订单处理\r策略模式的优缺点与适用环境\r

策略模式概述

旅游出行方式示意图

策略模式概述

分析\r实现某个目标的途径不止一条,可根据实际情况选择一条合适的途径\r软件开发:\r多种算法,例如排序、查找、打折等\r使用硬编码(Hard Coding)实现将导致系统违背开闭原则,扩展性差,且维护困难\r可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法?策略类

策略模式

策略模式概述

策略模式的定义\r\r\r\r\r\r对象行为型模式

策略模式概述

策略模式的定义\r又称为政策(Policy)模式\r每一个封装算法的类称之为策略(Strategy)类\r策略模式提供了一种可插入式(Pluggable)算法的实现方案\r

策略模式的结构与实现

策略模式的结构\r\r

策略模式的结构与实现

策略模式的结构\r策略模式包含以下3个角色:\rContext(环境类)\rStrategy(抽象策略类)\rConcreteStrategy(具体策略类)\r

策略模式的结构与实现

策略模式的实现\r典型的抽象策略类代码:

策略模式的结构与实现

策略模式的实现\r典型的具体策略类代码:

策略模式的结构与实现

策略模式的实现\r典型的环境类代码:

策略模式的结构与实现

策略模式的实现\r典型的客户端代码片段:

策略模式的应用实例

实例说明

策略模式的应用实例

实例类图

电影票打折方案结构图

策略模式的应用实例

实例代码\r(1) MovieTicket:电影票类,充当环境类\r(2) Discount:折扣类,充当抽象策略类\r(3) StudentDiscount:学生票折扣类,充当具体策略类\r(4) ChildrenDiscount:儿童票折扣类,充当具体策略类\r(5) VIPDiscount:VIP会员票折扣类,充当具体策略类\r(6) 配置文件App.config\r(7) Program:客户端测试类\r

演示……

参考代码 (DesignPattern\StrategySample)

策略模式的应用实例

结果及分析\r如果需要更换具体策略类,无须修改源代码,只需修改配置文件即可,完全符合开闭原则\r\r\r\r\r

PetShop 4.0中的订单处理

PetShop 4.0的BLL(Business Logic Layer,业务逻辑层)子项目局部结构\r\r\r\r\r

PetShop订单策略类结构图

PetShop 4.0中的订单处理

配置文件web.config代码片段:\r\r\r\r\r

策略模式的优缺点与适用环境

模式优点\r提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为\r提供了管理相关的算法族的办法\r提供了一种可以替换继承关系的办法\r可以避免多重条件选择语句\r提供了一种算法的复用机制,不同的环境类可以方便地复用策略类\r\r

策略模式的优缺点与适用环境

模式缺点\r客户端必须知道所有的策略类,并自行决定使用哪一个策略类\r将造成系统产生很多具体策略类\r无法同时在客户端使用多个策略类\r\r

策略模式的优缺点与适用环境

模式适用环境\r一个系统需要动态地在几种算法中选择一种\r避免使用难以维护的多重条件选择语句\r不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性\r\r

思考

在策略模式中,一个环境类Context能否对应多个不同的策略等级结构?如何设计?\r

END

Thanks!