前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之模板方法模式

设计模式之模板方法模式

作者头像
beginor
发布2020-08-10 11:23:28
2370
发布2020-08-10 11:23:28
举报
文章被收录于专栏:张志敏的技术专栏

设计模式之模板方法模式

结构

模板方法模式
模板方法模式

说明

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

模板方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先构建一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

适用条件

  1. 一次性实现一个算法的不变的部分, 将可变得行为留给子类来实现;
  2. 各子类中公共的行为应该被提取出来并集中到一个公共父类中以避免代码重复;
  3. 控制子类扩展。

实现

代码语言:javascript
复制
public abstract class Game {

   protected int PlayerCount;

   public abstract void InitializeGame();

   protected abstract void MakePlay(int player);

   protected abstract bool EndOfGame();

   protected abstract void PrintWinner();

   public void PlayOneGame(int playerCount) {
      this.PlayerCount = playerCount;

      this.InitializeGame();

      var j = 0;
      while (!this.EndOfGame()) {
         this.MakePlay(j);
         j = (j + 1) % this.PlayerCount;
      }
      this.PrintWinner();
   }

}

public class Monopoly : Game {
   
   public override void InitializeGame() {
      Console.WriteLine("Initialize players");
      Console.WriteLine("Initialize money");
   }

   protected override void MakePlay(int player) {
      Console.WriteLine("Process one turn of player");
   }

   protected override bool EndOfGame() {
      Console.WriteLine("Return true if game is over, according to Monopoly rules.");
      return true;
   }

   protected override void PrintWinner() {
      Console.WriteLine("Whow won ?");
   }

}

public class Chess : Game {
   
   public override void InitializeGame() {
      throw new NotImplementedException();
   }

   protected override void MakePlay(int player) {
      throw new NotImplementedException();
   }

   protected override bool EndOfGame() {
      throw new NotImplementedException();
   }

   protected override void PrintWinner() {
      throw new NotImplementedException();
   }

}

class Client {
   
   static void Main(string[] args) {
      Game monopolyGame = new Monopoly();
      monopolyGame.PlayOneGame(4);

      Console.ReadKey();
   }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式之模板方法模式
    • 结构
      • 说明
        • 适用条件
          • 实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档