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

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

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

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

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

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

基类

 

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

派生类

 

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

执行

 

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

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

posted @ 2009-08-27 16:32  YangQ  阅读(2452)  评论(13编辑  收藏  举报