展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > java设计模式中的策略模式与状态模式实例分析

java设计模式中的策略模式与状态模式实例分析

使用场景状态模式:当对象的行为随对象的状态的改变而改变时,我们为了解耦多重判断条件,封装行为的变化,可以定义一个抽象的状态类,提供对象行为接口。具体与状态相关的行为,由它的子类去实现。策略模式:“策略”二字等同于算法,当现实系统中需要对算法动态指定,并且可以互相替换,可以抽象出算法的调用接口,具体的算法实现由具体的策略角色去实现,根据里氏替换原则,任何出现父类的地方都可以使用它的子类去替换,这样符合我们的业务需求。比较虽然两者都是抽象出父类规范调用接口,具体的行为由子类实现,环境对象同时包含父类的引用,但

本文目录

    使用场景

    状态模式:当对象的行为随对象的状态的改变而改变时,我们为了解耦多重判断条件,封装行为的变化,可以定义一个抽象的状态类,提供对象行为接口。具体与状态相关的行为,由它的子类去实现。

    策略模式:“策略”二字等同于算法,当现实系统中需要对算法动态指定,并且可以互相替换,可以抽象出算法的调用接口,具体的算法实现由具体的策略角色去实现,根据里氏替换原则,任何出现父类的地方都可以使用它的子类去替换,这样符合我们的业务需求。

    比较

    虽然两者都是抽象出父类规范调用接口,具体的行为由子类实现,环境对象同时包含父类的引用,但是这两者模式应用的场景完全不同。例如:你去ATM机取款,如果你的账户处于冻结状态,就不能正常取款。这里你的银行账户至少有两个状态就是冻结与非冻结。这样的业务解决方案你应该不会想到用策略模式去解决。又如商场打折,有很多打折的策略,儿童用品打7折,老人用品打5折,这个问题不会跟状态模式扯上关系吧,这里商品你不能说有老人状态和儿童状态!

    ATM取款案例分析

    设计到的角色:取款人、账户、ATM机。

    用例图

    这边简单起见,就分析取款用例。

    java设计模式中的策略模式与状态模式实例分析

    基本事件路径

    (1) 取款人插入银行卡,输入密码;

    (2) 选择取款操作,输入取款金额;

    (3) 等待出钞,取款。

    在这个用例中,如果取款人账户已冻结,就发生一个可选事件路径,取款用例就被终止。

    关键的业务需求是用户取款事实,所以领域建模可以从标识取款和取款人这两个类开始。这边考虑到取款人不仅有取款这个用例,我们将取款泛化成交易。

    建模

    java设计模式中的策略模式与状态模式实例分析

    用例实化

    取款:基本事件路径的实化。

    java设计模式中的策略模式与状态模式实例分析

    细化领域模型

    这边引入了ATMSystem这个边界对象作为控制器负责与用户交互(与用户交互的ATM操作界面),Trade是负责处理用户交易的类。

    取款人插入银行卡输入密码,ATMSystem负责将验证账户信息的消息传递给Trade交易类,Trade根据传过来的账户密码验证用户是否存在,然后将处理结束的消息传递给ATMSystem这个边界对象反映给用户。

    分析模型中的一些类

    java设计模式中的策略模式与状态模式实例分析

    取款设计——应用状态模式

    账户的状态分为冻结状态和激活状态。账户在激活的状态下可以进行交易,而在冻结状态下不能做任何交易。在账户验证的时候,应该返回当前账户的状态,如果账户处于冻结状态,当取款人进行取款操作的时候直接返回错误提示信息。状态图表示如下:

    java设计模式中的策略模式与状态模式实例分析

    取款应用状态模式结构图:

    java设计模式中的策略模式与状态模式实例分析

    在验证账户阶段,如果账户处于冻结状态,则直接返回DeadAccount谢绝一切交易,否则返回ActiveAccount处理后面的交易。

    示意代码:

    这边为了简单实现,省去了ATMSystem这个边界对象。

    用户账号信息抽象类

    ///  /// 用户账号信息 ///  public abstract class Account {     ///      /// 账号     ///      private string account;     ///      /// 密码     ///      private string pwd;     public abstract decimal getBalance(decimal d); }

    冻结账号类

    ///  /// 冻结账户类 ///  public class DeadAccount:Account {       public override decimal getBalance(decimal d)     {         return 0;     } }

    激活账户类

    ///  /// 激活账户类 ///  public class ActiveAccount:Account {     public override decimal getBalance(decimal d)     {         return d;     } }

    交易类

    ///  /// 交易类 负责用户交易处理的类 ///  public class Trade {     ///      /// 保存用户账号信息     ///      private Account account;     public Account VolidateLogin(Account a)     {                    //query the database to validate the user exists         //For Example         this.account = new DeadAccount();         return this.account;     }       ///      /// 商业逻辑 取款     ///      ///      ///      public decimal GetBalance(decimal d)     {         return this.account.getBalance(d);     }  }

    用户类

    ///  /// 取款人 ///  public class User {     ///      /// 用户账号信息     ///      private Account account;     ///      /// 交易处理类     ///      private Trade trade;       public User(Account a, Trade t)     {         this.account = a;         tthis.trade = t;     }     ///      /// 用户登录类     ///      public void Login()     {         trade.VolidateLogin(account);     }       ///      /// 取款     ///      ///      ///      public decimal GetBalance(decimal d)     {         return trade.GetBalance(d);     } }

    客户端代码

    class Client     {         static void Main(string[] args)         {             //开始用户取款,默认是激活账户             ActiveAccount aa = new ActiveAccount();             Trade t = new Trade();             User u = new User(aa,t);             //先登录,后取款             u.Login();             Console.WriteLine(u.GetBalance(100));             Console.ReadLine();         }     }

    用户必须先登录(插入银行卡,输入密码,点确定),才能选择取款业务(选择取款)。登录之后,返回的账号对象作为trade类成员,当进行取款业务的时候直接引用该账号成员获得取款信息。如果该账号属于冻结账号,则直接返回0。否则返回取款的值。

    商品折扣案例

    案例描述:某家超市国庆节为了促销,某些类商品打折,比如运动鞋打8折、秋装打9折等,张三去购物为了一双运动鞋、一件秋装、一瓶洗发水。。。,张三买完东西回家,心想今天自己总共“赚”了多少钱?

    案例分析:商家对于商品打折可能有很多策略,这里使用策略模式,封装商品打折策略,这样以便以后扩展了打折策略,不用去修改原来的代码,具有很好的灵活性。

    模式涉及的角色:

    抽象策略角色:通常由一个接口或者抽象实现;

    具体策略角色:包装了相关的算法和行为;

    环境角色:包含抽象策略角色的引用,最终供用户使用。

    商品折扣案例设计图

    java设计模式中的策略模式与状态模式实例分析

    顾客购物涉及到的角色有:购物车、商品、收银台、抽象策略角色和具体策略角色。

    购物车:是摆放商品的容器,提供添加和删除操作;

    商品:商品实体,有类型,商品名、价格等属性;

    收银台:负责收钱,主要是计算顾客购买所有商品的价格和折扣总额;

    抽象策略角色:提供折扣策略接口。

    具体策略角色:实现具体折扣算法。

    商品折扣示意代码:

    ///  /// 具体商品类 ///  public class goods {     ///      /// 商品类型     ///      public string Type     {         set;         get;     }       ///      /// 商品名称     ///      public string Name     {         get;         set;     }         ///      /// 商品价格     ///      public decimal Price     {         get;         set;     }   }

    抽象策略角色

    ///  /// 抽象策略接口 ///  public interface IDiscountStrategy {     decimal GetDiscount(goods g); }

    具体策略角色

    ///  /// 秋装打折策略 ///  public class AutumnDressDiscountStrategy:IDiscountStrategy {     #region IDiscountStrategy Members       public decimal GetDiscount(goods g)     {         return (decimal)0.9 * g.Price;     }       #endregion }     ///  /// 运动鞋打折策略 ///  public class SportShoesDiscountStrategy:IDiscountStrategy {     #region IDiscountStrategy Members       public decimal GetDiscount(goods g)     {         return g.Price * (decimal)0.8;     }       #endregion }

    购物车

     

    ///  /// 购物车类 负责商品的维护 ///  public class ShoppingCar {     private List goodsList=new List();       ///      /// 将商品加入到购物车     ///      ///      public void AddGoods(goods g)     {         goodsList.Add(g);     }       ///      /// 将商品从购物车当中移除     ///      ///      public void RemoveGoods(goods g)     {         goodsList.Remove(g);     }       public List GoodsList     {         get         {             return goodsList;         }     }   }

    收银台角色

    ///  /// 收银台 ///  public class CashierDesk {     ///      /// 购物车     ///      private ShoppingCar shoppingCar;     ///      /// 策略字典     ///      private Dictionary strategies;       public CashierDesk(ShoppingCar sc, Dictionary s)     {         this.shoppingCar = sc;         this.strategies = s;     }       ///      /// 获得所有商品的价格     ///      ///      public decimal GetTotalPrice()     {         return shoppingCar.GoodsList.Sum(p => p.Price);     }       ///      /// 获得所有商品的总的折扣     ///      ///      public decimal GetTotalDiscount()     {         decimal sum = 0;         IDiscountStrategy idiscountStrategy;         foreach (goods g in shoppingCar.GoodsList)         {             idiscountStrategy=strategies.SingleOrDefault(p => p.Key == g.Type).Value;             if (idiscountStrategy != null)             {                 sum += idiscountStrategy.GetDiscount(g);             }         }         return sum;     } }

    客户端代码

    class Client     {         static void Main(string[] args)         {             ShoppingCar sc = new ShoppingCar();             Dictionary discountD = new Dictionary();             //向购物车中加入商品             sc.AddGoods(new goods {Name="NIKE鞋 ",Price=100,Type="运动鞋" });             sc.AddGoods(new goods { Name = "秋装", Price = 200, Type = "秋装" });             sc.AddGoods(new goods { Name = "苹果", Price = 300, Type = "水果" });             //配置折扣策略             discountD.Add("运动鞋", new SportShoesDiscountStrategy());             discountD.Add("秋装", new AutumnDressDiscountStrategy());             CashierDesk cd = new CashierDesk(sc, discountD);             //得到所有商品总价             Console.WriteLine(cd.GetTotalPrice());             //得到所有商品折扣价             Console.WriteLine(cd.GetTotalDiscount());               Console.ReadLine();         }     }

    策略模式优点与缺点:

    优点

    封装了算法不稳定性,易于以后业务策略的扩展。

    缺点

    每种策略对应于一个具体策略角色类,会增加系统需要维护的类的数量。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。