设计模式

第 3 章 Template Method 模式 -- 将具体处

2018-08-31  本文已影响1人  oO反骨仔Oo
image.png

Template Method 模式

概念:在父类中定义处理流程的框架,在子类中实现具体处理的模式。

示例

image.png
    /// <summary>
    /// 抽象显示
    /// </summary>
    public abstract class AbstractDisplay
    {
        /// <summary>
        /// 打开
        /// </summary>
        public abstract void Open();

        /// <summary>
        /// 打印
        /// </summary>
        public abstract void Print();

        /// <summary>
        /// 关闭
        /// </summary>
        public abstract void Close();

        /// <summary>
        /// 显示
        /// </summary>
        public void Display()
        {
            Open();

            for (var i = 0; i < 5; i++)
            {
                Print();
            }

            Close();
        }
    }
    /// <summary>
    /// 字符显示
    /// </summary>
    public class CharDisplay : AbstractDisplay
    {
        private readonly char _c;

        public CharDisplay(char c)
        {
            _c = c;
        }

        public override void Open()
        {
            Console.Write("<<");
        }

        public override void Print()
        {
            Console.Write(_c);
        }

        public override void Close()
        {
            Console.WriteLine(">>");
        }
    }
    /// <summary>
    /// 字符串显示
    /// </summary>
    public class StringDisplay : AbstractDisplay
    {
        private readonly string _str;
        private readonly int _width;

        public StringDisplay(string str)
        {
            _str = str;
            _width = Encoding.UTF8.GetByteCount(_str);
        }

        public override void Open()
        {
            PrintLine();
        }

        public override void Print()
        {
            Console.WriteLine($"|{_str}|");
        }

        public override void Close()
        {
            PrintLine();
        }

        private void PrintLine()
        {
            Console.Write("+");

            for (var i = 0; i < _width; i++)
            {
                Console.Write("-");
            }

            Console.WriteLine("+");
        }
    }
    internal class Program
    {
        private static void Main(string[] args)
        {
            AbstractDisplay ad = new CharDisplay('H');
            AbstractDisplay ad2 = new StringDisplay("Hello,world.");
            AbstractDisplay ad3 = new StringDisplay("你好,世界。");

            ad.Display();
            ad2.Display();
            ad3.Display();

            Console.Read();
        }
    }
image.png

角色梳理

AbstractClass 抽象类

负责实现模板方法,以及声明在模板方法中用到的抽象方法,抽象方法由子类 ConcreteClass 角色实现。

ConcreteClass 具体类

负责实现 AbstractClass 中定义的抽象方法,所实现的方法会在对应的模板方法中被调用。


image.png

要点 & 思路

1.使逻辑通用化,在父类的模板方法中编写了算法,因此无需再每个子类中再编写算法;

相关模式

Factory Method 模式

Factory Method 模式通过 Template Method 模式生成实例。

Strategy 模式

Template Method 模式通过继承改变程序行为,Strategy 通过替换算法改变程序行为。

《图解设计模式》

上一篇下一篇

猜你喜欢

热点阅读