凑个热闹,约瑟夫环的OO实现

今天看到了两篇博文《关于一道C#上机题的一点想法》和《关于<关于一道C#上机题的一点想法> 》,都是说约瑟夫环的OO实现,这两篇文章给了我很好的启发,但是二者的实现和我相像的还有一些差距,于是忍不住自己动了下手。

既然是OO,那肯定要符合OO的原则,最先想到的就是开放封闭原则。对于约瑟夫环哪些是可变的,哪些是不可变的,我思考了一下。

可变的部分:
1、环的长度和起始的位置(这个是最基本的扩展);
2、找到下一个人位置的方式(可以隔三个,也可以隔五个,甚至可以进三个退两个);
3、找到人后所做的操作(简单地输出或是让他跳三跳、给朵大红花);
4、围成圈的不一定是人,阿猫阿狗也可以。

不变的部分:
1、环是肯定不会变的;
2、肯定有一个确定下一个位置的方式;
3、找到人后无论给不给他红花,但他一定要出列,不然游戏玩不完了。

基于以上分析,将不变的部分写了个抽象泛型基类。之所以用抽象,就因为很多变化的东西不能确定;之所以用泛型,就是给阿猫阿狗准备的。

基类

 

基类实现了约瑟夫环的最核心操作,接下来的派生就可以按需求来定制。

派生类

 

这个派生类完成了最简单、最传统的操作,当然可以扩展得复杂一些。接下来按要求执行就可以了。

执行

 

结果就不截图了,和《关于<关于一道C#上机题的一点想法> 》一文相同。

以上纯属一己之见,也许对开放封闭原则领会的不是很好,还恳请高手指点。

posted @   YangQ  阅读(2453)  评论(13编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示