【问题标题】:What is the difference between Facade and Template Method Pattern in C#?C# 中的外观和模板方法模式有什么区别?
【发布时间】:2017-03-31 04:26:15
【问题描述】:

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

立面图案

 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 模式就像一个库的 API(可能类似于 System 命名空间,一切都源于它,它是 mscorlib.dll 和其他库的外观),就像你的应用程序的接口层,而您在后台拥有业务和数据层,模板方法模式类似于启发式 - 收据来做某事而不是实际实现。
  • @αNerd 我已经更新了这个问题,你注意到这两种模式有什么不同吗?如果是,那么你能帮我理解吗?谢谢
  • @Lijin John。比萨订购应用程序:您使用一些基本控件,例如按钮、菜单和选择器。使用它们,您可以选择尺寸、添加量、数量。还要填写地址,.. 最后您通过单击订单按钮下订单。这是客户端的接口。在里面你有餐厅的内部运作。有人挑选订单,将其转移到餐厅,餐厅将其转移给送货员。他/她把披萨送到你家门口。您不在乎他们如何以及如何处理交付,准备比萨饼,将其/它们带给您。比萨应用是门面。
  • 模板是他们在基本步骤中所做的,而不是细节,这样你就可以吃披萨了。门面是给消费者、前端用户,模板是给创造者、建造者。
  • 模板:youtube.com/watch?v=kBT4xfloMAQ。门面:youtube.com/watch?v=a2Qh10YjP6Y。还有很多。基本上任何语言示例都可以完成这项工作。

标签: c# design-patterns facade template-method-pattern


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助:),通过查看您的示例代码,我有一个小问题。您的示例代码看起来不像装饰器模式。如果我错了,请原谅我。
【解决方案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 东西才能正确执行。

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

【讨论】:

  • 我更新了我的问题。你能帮我理解吗
【解决方案3】:

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

现在回答你的问题:

在您的示例中,在模板模式中,请注意您仅使用算法的一个对象。但门面并非如此。虽然您使用过静态对象,但看看其中涉及多少不同类型的对象。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2015-05-21
    • 2012-06-26
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多