zoukankan      html  css  js  c++  java
  • 关于某道C#上机题的OO 策略模式

           前段时间看到某人《关于某道C#上机题的OO》 ,后来又有人用了装饰模式做这题,我这里来个策略模式,不习惯废话直接上代码,不知道算不算策略模式,请高人指点。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 namespace ConsoleApp
      5 {
      6     public class Program
      7     {
      8         static void Main(string[] args)
      9         {
     10             Game game = new Game(17);
     11             //设定策略
     12             game.Strategy = new StrategyA();
     13             game.GameOver += new EventHandler(game_GameOver);
     14             game.Start();
     15             Console.Read();
     16         }
     17         static void game_GameOver(object sender, EventArgs e)
     18         {
     19             Console.WriteLine("Last Person:" + sender);
     20         }
     21     }
     22     /// <summary>
     23     /// 策略接口
     24     /// </summary>
     25     public interface IStrategy
     26     {
     27         /// <summary>
     28         /// 运行策略
     29         /// </summary>
     30         /// <param name="g"></param>
     31         void Work(Game g);
     32     }
     33     /// <summary>
     34     /// 策略A
     35     /// 从第一个人开始报数,报到3的倍数退出,一直到剩下最后一个人,用面向对象的思想去做这道题。
     36     /// </summary>
     37     public class StrategyA : IStrategy
     38     {
     39         private List<Person> over = new List<Person>();
     40         private int k = 0;
     41         public void Work(Game game)
     42         {
     43             foreach (Person p in game.Players)
     44             {
     45                 p.Say(++k);
     46                 if (k % 3 == 0)
     47                     over.Add(p);   
     48             }
     49             game.Players.RemoveAll(o => over.Contains(o));
     50         }
     51     }
     52     public delegate void EventHandler(object sender , EventArgs e);
     53     /// <summary>
     54     /// 游戏
     55     /// </summary>
     56     public class Game
     57     {
     58         public Game(int num)
     59         {
     60             Players = new List<Person>();
     61             for (int i = 0; i < num; i++) {
     62                 Players.Add(new Person(i + 1));
     63             }
     64         }
     65         /// <summary>
     66         /// 游戏策略
     67         /// </summary>
     68         public IStrategy Strategy { getset; }
     69         /// <summary>
     70         /// 游戏玩家
     71         /// </summary>
     72         public List<Person> Players { getset; }
     73         /// <summary>
     74         /// 游戏结束事件
     75         /// </summary>
     76         public event EventHandler GameOver;
     77         /// <summary>
     78         /// 开始游戏
     79         /// </summary>
     80         public void Start()
     81         {
     82             if (Strategy != null)
     83             {
     84                 while (Players.Count > 1)
     85                 {
     86                     Strategy.Work(this);
     87                 }
     88                 GameOver(this.Players.First().Id, new EventArgs());
     89             }
     90         }
     91     }
     92     /// <summary>
     93     /// 玩家
     94     /// </summary>
     95     public class Person
     96     {
     97         public Person(int id)
     98         {
     99             this.Id = id;
    100         }
    101         /// <summary>
    102         /// 玩家ID
    103         /// </summary>
    104         public int Id { getset; }
    105         /// <summary>
    106         /// 玩家报数
    107         /// </summary>
    108         /// <param name="num"></param>
    109         public void Say(int num)
    110         {
    111             Console.WriteLine(string.Format("{0}:{1}", Id, num));
    112         }
    113     }
    114 }
    115 

     


    StrategyA 实现接口 IStrategy 遵循开闭原则,如果我们要换一个规则只要添加一个类实现IStrategy即可。
    之前还有用 循环链表 来完成这道题,晚上再发上来。

  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/farmer/p/1562514.html
Copyright © 2011-2022 走看看