设计模式之模板模式

模板模式

在模板模式中,一个抽象类公开定义了执行它的方法/模板,它的子类可以按照需要重写方法实现,但调用以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

使用场景:1.有多个子类公有的方法,且逻辑相同。2.重要的、复杂的方法,可以考虑作为模板方法。

如何使用:有一些通用的方法。

关键代码:把不变的行为搬移到父类,可变的行为在父类中抽象,延迟到子类中具体实现。

优点:1.封装不变部分,扩展可变部分。2.提取公共代码,便于维护。3.行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类,导致类的个数增加,使得系统过于庞大。

实例

共有的方法抽象至基类

public abstract class Game
    {
        public abstract void Initialize();
        public abstract void StartPlay();
        public abstract void EndPlay();

        public void Play()
        {
            //初始化游戏
            Initialize();

            //开始游戏
            StartPlay();

            //结束游戏
            EndPlay();
        }
    }

 子类重写可变行为

public class Cricket : Game
    {
        
        public override void Initialize()
        {
            Console.WriteLine("Cricket Game Initialized! Start playing.");
        }

        public override void StartPlay()
        {
            Console.WriteLine("Cricket Game Started. Enjoy the game!");
        }

        public override void EndPlay()
        { 
            Console.WriteLine("Cricket Game Finished!");
        }
    }
public class Cricket : Game
    {
        
        public override void Initialize()
        {
            Console.WriteLine("Cricket Game Initialized! Start playing.");
        }

        public override void StartPlay()
        {
            Console.WriteLine("Cricket Game Started. Enjoy the game!");
        }

        public override void EndPlay()
        { 
            Console.WriteLine("Cricket Game Finished!");
        }
    }
public class Football : Game
    {
        public override void Initialize()
        {
            Console.WriteLine("CricketFootball Game Initialized! Start playing.");
        }

        public override void StartPlay()
        {
            Console.WriteLine("Football Game Started. Enjoy the game!");
        }

        public override void EndPlay()
        {
            Console.WriteLine("Football Game Finished!");
        }
    }

客户端调用

static void Main(string[] args)
        {
            Console.WriteLine("-------模板模式--------");
            {
                Game gameCricket = new Cricket();
                gameCricket.Play();

                Game gameFootball = new Football();
                gameFootball.Play();
            }
            Console.ReadLine();
        }

结果输出

 

posted @ 2018-09-08 11:11  王小豆又叫小王子  阅读(140)  评论(0编辑  收藏  举报