c#中Facade和Template方法模式的区别是什么?
本文关键字:区别 是什么 模式 方法 Facade Template | 更新日期: 2023-09-27 18:18:29
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模式都实现了一个接口,并且使用了一个抽象,并定义了应该如何处理操作。我看不出这两种式样有什么不同。谁能帮我理解一下?
Facade模式将通过在包装器方法下组合子功能来引入新的功能。在这种情况下,Facade类与子类具有不同的结构。
模板模式在基类中提供了算法的框架,并为派生类提供了重写/实现该算法的一些单元的可能性。
在这种情况下,从模板派生的类与基类具有相同的结构。
模板方法模式的主要目的是定义一些泛型算法,其中一些实现细节可能由派生类指定。
下面是一个例子:
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
,它使用相同的算法来驱动,但需要它自己的ElectricEngine
和AutomaticGearbox
的东西来正确地完成它。
facade模式可用于简化包含在多个接口或模块中的某些逻辑的使用。例如,静态类Console
可以被视为控制台使用的外观。它隐藏了实现细节,并提供了一些我们可以轻松使用的简单方法。但是,我们不能通过提供一些额外的实现来改变facade的行为。
简单来说:模板方法属于基类,并允许子类重新定义一些步骤。您创建一个类的对象并调用这个模板方法来完成您的工作。但是facade通常涉及来自许多不同类的多个对象。这一次,您将执行一系列步骤来完成涉及所有这些对象的任务。您不需要在这些类中重新定义方法,相反,您可以轻松地调用它们。
现在回答你的问题:
在您的示例中,在模板模式中,请注意您只使用了算法的一个对象。但事实并非如此。虽然您已经使用了静态对象,但看看这里涉及到多少不同类型的对象。