我是设计模式的初学者。

假设我正在开发一个 C# 应用程序来跟踪开发团队中各个成员执行的开发工作(即项目跟踪器)。

我试图从战略模式中获得灵感。

所以我正在设计我的类和接口(interface)如下:

interface IEmployee 
{ 
    void Retires(); 
    void TakesLeave(); 
} 
 
interface IResponsible 
{ 
void AcknowledgeJobAccomplish(); 
void CompletesJob(); 
} 
 
interface ILeader 
{ 
    void FormsTeam(); 
    void RecruitsNewMember(); 
    void KicksOutMemberFromTheTeam(); 
    void AssignsJob(); 
void UnassignsJob(); 
void QueriesTheJobStatus(); 
void ChangesTheJobStatus(); 
} 
 
interface IPersistent 
{ 
    void Save(); 
    void Update(); 
    void Delete();   
} 
 
abstract class TeamMember : IEmployee, IResponsible, IPersistent 
{ 
    string Name; 
} 
 
class Programmer : TeamMember 
{ 
} 
 
class LeadProgrammer : Programmer, ILeader 
{ 
    ProgrammerCollection associateProgrammers; 
} 
 
class ProjectManager :  TeamMember, ILeader 
{ 
    TeamMemberCollection teamMembers; 
} 
 
abstract class Tester : TeamMember 
{ 
} 
 
class UnitTester : Tester 
{ 
} 
 
class QC : Tester 
{ 
} 
 
class SupportStaff : TeamMember 
{ 
} 

我应该做些什么来改进这个设计?

请您参考如下方法:

好吧,首先,您所拥有的不是策略模式的实例。 Strategy Pattern允许对完成工作的方法进行动态规范。您在这里所拥有的实际上更像是一个标准的接口(interface)设计,您可以通过接口(interface)继承来分配职责和能力。

编辑:让我们举个例子。假设您有一组 worker ;您还有一组任务。每个 Worker 可以执行一个任务。这些任务可以包含多个内容,例如 DoFoo() 和 DoBar()。每个 Worker 都不知道他们将执行什么任务;他们只知道当他们出现时他们将执行一项任务。

因此,我们希望将 Workers 建模为他们将执行的任务。由于任务变化很大,我们将任务实现为接口(interface)。

所以我们会有:

public class Worker  
{ 
   public Task myTask; 
 
   public Worker(Task task) 
   { 
      myTask = task; 
   } 
 
   public void DoWork()  
      { 
      myTask.DoTask(); 
      } 
   } 
} 
 
Interface Task 
{ 
   void DoTask(); 
} 
 
public class Task1 : Task 
{ 
   public void DoTask() 
   { 
   // Do whatever Task1 will do 
   } 
} 
 
public class Task2 : Task 
{ 
   public void DoTask() 
   { 
   // Do whatever Task2 will do 
   } 
} 
 
public class Job 
{ 
   public List<Worker> workers; 
 
   public void Job() 
   { 
      workers.Add(new Worker(new Task1())); 
      workers.Add(new Worker(new Task2())); 
   } 
 
   public void DoJob() 
   { 
      foreach (Worker worker in workers) 
      { 
      worker.DoWork(); 
      } 
   } 
 
   public void ChangeJobsToTask1() 
   { 
      foreach (Worker worker in workers) 
      { 
         worker.myTask = new Task1(); 
      } 
   } 
 
   public void ChangeJobsToTask2() 
   { 
      foreach (Worker worker in workers) 
      { 
         worker.myTask = new Task2(); 
      } 
   } 
} 

那么当我们实例化一个 Job 时会发生什么? , Job创建两个 Worker s。第一个 Worker有一个 Task1任务;第二个 Worker有一个 Task2任务。制作 Worker做他们的 Task s,我们称之为 DoJob() Job 上的方法类,它只调用 DoWork()每个 Worker 上的方法s,然后调用 DoTask()每个 Task 上的方法s 那 Worker s 被设置为。

如果我们要更改 Worker所有人都要做 Task1 ,我们称之为 ChangeJobsToTask1()方法,它设置 TaskTask1对于所有 Worker Job 包含的对象;如果那时我们调用 DoJob()Job对象,所有 Worker s 将执行 Task1任务。同样,如果我们要更改 Task转至 Task2 ,只需调用 ChangeJobsToTask2()方法;所有 Worker然后 s 将执行 Task2.DoTask()当他们的 DoWork()方法被调用。

这里抽象的重点是 Worker s 公开一个 DoWork()方法,但他们不一定知道正在完成的工作是什么。也就是说, Task s 为 Worker s 是可以互换的; Worker s 只知道他们要做 Task ,但它的细节对于 Worker 来说并不重要。 s。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!