首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中,外观和模板方法模式有什么区别?

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

Stack Overflow用户
提问于 2016-11-16 19:57:01
回答 3查看 2.1K关注 0票数 0

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

外观模式

代码语言:javascript
复制
 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();
        }
    }

模板模式

代码语言:javascript
复制
 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设计模式

在上面提供的示例中,Facade和模板模式都实现了接口,并且使用了抽象,并定义了应该如何处理操作。我没有发现这两种模式有什么区别。有人能帮我理解吗。

EN

Stack Overflow用户

发布于 2016-11-16 20:16:49

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

下面是一个示例:

代码语言:javascript
复制
abstract class Car
{
    public void Drive()
    {
        IgnitionOn();
        EngineOn();
        EngageTransmission();
    }

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

在这里,Drive()方法是一个模板方法,它定义了泛型行为(如何驱动)。但是每个派生类都可以(或者,在本例中必须)提供实现细节。

示例:

代码语言:javascript
复制
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可视为控制台使用的外观。它隐藏了实现细节,并提供了一些我们可以轻松使用的简单方法。但是,我们不能通过提供一些额外的实现来改变外观的行为。这就是不同之处。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40641170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档