【发布时间】: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