C#中的Facade和Template Method Pattern有什么区别?

时间:2016-11-16 19:57:02

标签: 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();
        }
    }

模板模式

 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());
        }
    }

此示例取自O'Reilly Design Patterns

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

3 个答案:

答案 0 :(得分:2)

模板方法模式的主要目的是定义一些通用算法,其中某些实现细节可能由派生类指定。

以下是一个例子:

abstract class Car
{
    public void Drive()
    {
        IgnitionOn();
        EngineOn();
        EngageTransmission();
    }

    protected abstract void IgnitionOn();
    protected abstract void EngineOn();      
    protected abstract void EngageTransmission();
}

此处Drive()方法是定义通用行为(如何驱动)的模板方法。但是每个派生类都可以(或者,在这个例子中,必须)提供实现细节。

示例:

class DieselCarWithManualGearbox : Car
{
    protected override void IgnitionOn()
    {
        IgnitionControlModule.IgnitionState = IgnitionState.On;
    }

    protected override void EngineOn()
    {
        DieselEngine.StartFuelPump();
        DieselEngine.Run();
    }

    protected override void EngageTransmission()
    {
        ManualGearbox.Gear = 1;
    }
}

DieselCarWithManualGearbox类提供了一些特定的实现,但整个算法保持不变。然后,您创建了一些使用相同算法进行驾驶的ElectroCarWithAutomaticGearbox,但需要使用自己的ElectricEngineAutomaticGearbox来正确执行此操作。

Facade模式可用于简化多个接口或模块中包含的某些逻辑的使用。例如,静态类Console可以看作是控制台使用的外观。它隐藏了实现细节,并提供了一些我们可以轻松使用的简单方法。我们不能通过提供一些额外的实现来改变外观的行为。差别就是这样。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

简单来说:模板方法属于基类,允许子类重新定义一些步骤。您创建一个类的对象并调用此模板方法来完成您的工作。 但是门面通常涉及来自许多不同类的多个对象。这次您将执行一系列步骤来完成涉及所有这些对象的任务。您无需重新定义这些类中的方法,而是设法轻松调用它们。

现在回答您的问题:

在您的示例中,在模板模式中,看到您仅使用算法的一个对象。但对于立面而言,情况并非如此。尽管您使用了静态对象,但请查看其中涉及多少不同类型的对象。