2016-11-16 12 views
0

В чем разница между шаблоном метода «Фасад» и «Шаблон»? Оба они обеспечивают представления высокого уровня подсистемы и скрывают их от пользователя.В чем разница между шаблоном метода Facade и шаблона в C#?

Фасад шаблон

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

В приведенном выше указанном примере, как Фасад и шаблон Шаблон реализовать интерфейс и использует абстракцию и определяет, как должна выполняться операция. Я не вижу разницы между этими двумя шаблонами. Может ли кто-нибудь помочь мне понять это.

+1

Фасадный шаблон похож на API библиотеки (возможно, аналогичный пространству имен System) и все, что из него является фасадом для mscorlib.dll и других библиотек), подобно интерфейсу вашего приложения, когда у вас есть бизнес и слой данных в капоте, шаблон метода шаблона - это что-то вроде эвристики - квитанция, которая не выполняет фактическую реализацию. –

+0

@ αNerd Я обновил вопрос, замечаете ли вы какое-либо отличие от обоих шаблонов? если да, тогда вы могли бы помочь мне понять это? спасибо –

+0

related: http: // stackoverflow.com/questions/1781860 – jaco0646

ответ

1

Основная цель шаблона метода шаблона - определить некоторый общий алгоритм, где некоторые детали реализации могут быть указаны производными классами.

Вот пример:

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 материалах, чтобы сделать это правильно.

Шаблон фасада может использоваться для упрощения использования некоторой логики, которая содержится в нескольких интерфейсах или модулях. Например, статический класс Console можно рассматривать как фасад для использования в консоли. Он скрывает детали реализации и предоставляет несколько простых методов, которые мы можем легко использовать. Мы не можем изменить поведение фасада, хотя и предоставляем некоторые дополнительные возможности. В этом разница.

+0

Благодарим вас за отзыв, я сделаю это :) –

+0

Я обновил свой вопрос. не могли бы вы помочь мне понять это –

1

Шаблон фасада вводит новые функции путем объединения подфункций под методом обертки. Фасад класса в этом случае имеет разную структуру, а затем подклассы.

Шаблонный шаблон обеспечивает скелет алгоритма в базовом классе и дает возможность для производных классов переопределять/реализовывать некоторые единицы этого алгоритма.
В этом случае классы, полученные из шаблона, имеют ту же структуру, что и базовый класс.

+0

спасибо за вашу помощь :), у меня есть небольшой вопрос, увидев ваш образец кода. Разве ваш образец кода не похож на шаблон Decorator. пожалуйста, простите меня, если я ошибаюсь. –

+1

@ LijinJohn, думаю, что вы были правы - обновленный ответ – Fabio

 Смежные вопросы

  • Нет связанных вопросов^_^