zoukankan      html  css  js  c++  java
  • 设计模式之模板模式

    模板模式

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

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

    使用场景: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();
            }

    结果输出

  • 相关阅读:
    BUAA OO Unit3 Summary——万物即可形式化
    BUAA OO Unit2 Summary
    BUAA OO Unit1 Summary
    [机器学习笔记(三)]保存加载模型的几种方式
    交互式多媒体图书平台的设计
    【tips】带公式的Markdown转pdf
    【学习笔记】码农的自我修养之必备技能
    【Callback接口初探】工程化编程实战Callback接口学习笔记
    在linux下配置VSCode的开发环境
    网络知识水平与网络编程技能水平测试
  • 原文地址:https://www.cnblogs.com/mohanchen/p/9608452.html
Copyright © 2011-2022 走看看