C#中的外观和模板方法模式有什么区别?

Lij*_*raj 0 c# design-patterns facade template-method-pattern

Facade 和 Template 方法模式有什么区别?它们都提供子系统的高级视图并对用户隐藏它。

外观图案

 internal class SubsystemA
    {
        internal string A1()
        {
            return "Subsystem A, Method A1\n";
        }
        internal string A2()
        {
            return "Subsystem A, Method A2\n";
        }
    }
    internal class SubsystemB
    {
        internal string B1()
        {
            return "Subsystem B, Method B1\n";
        }
    }
    internal class SubsystemC
    {
        internal string C1()
        {
            return "Subsystem C, Method C1\n";
        }
    }

    public static class Facade
    {

        static SubsystemA a = new SubsystemA();
        static SubsystemB b = new SubsystemB();
        static SubsystemC c = new SubsystemC();
        public static void Operation1()
        {
            Console.WriteLine("Operation 1\n" +
            a.A1() +
            a.A2() +
            b.B1());
        }
        public static void Operation2()
        {
            Console.WriteLine("Operation 2\n" +
            b.B1() +
            c.C1());
        }
    }

    // ============= Different compilation

    // Compile with csc /r:FacadeLib.dll Facade-Main.cs
    class Client
    {
        static void Main()
        {
            Facade.Operation1();
            Facade.Operation2();
        }
    }
Run Code Online (Sandbox Code Playgroud)

模板模式

 interface IPrimitives
    {
        string Operation1();
        string Operation2();
    }

    class Algorithm
    {
        public void TemplateMethod(IPrimitives a)
        {
            string s =
            a.Operation1() +
            a.Operation2();
            Console.WriteLine(s);
        }
    }

    class ClassA : IPrimitives
    {
        public string Operation1()
        {
            return "ClassA:Op1 ";
        }
        public string Operation2()
        {
            return "ClassA:Op2 ";
        }
    }

    class ClassB : IPrimitives
    {
        public string Operation1()
        {
            return "ClassB:Op1 ";
        }
        public string Operation2()
        {
            return "ClassB.Op2 ";
        }
    }

    class TemplateMethodPattern
    {

        static void Main()
        {
            Algorithm m = new Algorithm();

            m.TemplateMethod(new ClassA());
            m.TemplateMethod(new ClassB());
        }
    }
Run Code Online (Sandbox Code Playgroud)

这个例子取自O'Reilly 设计模式

在上面提供的示例中,外观和模板模式都实现了一个接口,并使用了抽象并定义了应该如何处理操作。我没有发现这两种模式之间有任何区别。任何人都可以帮助我理解它。

Fab*_*bio 6

外观模式将通过在包装器方法下组合子功能来引入新功能。在这种情况下,外观类与子类具有不同的结构。

模板模式在基类中提供了算法的骨架,并为派生类提供了覆盖/实现该算法的某些单元的可能性。
在这种情况下,从模板派生的类与基类具有相同的结构。