2013-12-06 3 views
0

Можем ли мы создать шаблон проектирования фасадов с использованием абстрактного класса или интерфейсов?Схема проектирования фасадов с интерфейсом

Сомон попросил меня подумать о том, как мы можем реализовать шаблон проектирования фасадов с использованием абстрактного класса или интерфейса. Я не думаю, что мы можем достичь этого с помощью абстрактного класса или интерфейса.

+6

Почему нет? Фасад - это в основном класс, который делегирует вызовы подсистеме. И этот класс может быть описан интерфейсом (или наследовать от абстрактного класса) –

ответ

0

Шаблон дизайна фасада предназначен для абстрагирования от деталей других реализаций класса. Если эти классы полностью закрыты, то обязательно. Мы можем использовать класс abstract с методами static.

Пример

public abstract class Animal { } 

public class Dog extends Animal 
{ 
    public void bark() { }; 
} 

public class Cat extends Animal 
{ 
    public void meow() { }; 
} 

public abstract class AnimalAdapter { 
    public static void speak(Animal animal) { 
     if(animal instanceof Dog) { 
      Dog dog = (Dog)animal; 
      dog.bark(); 
     } 
     else if(animal instanceof Cat) { 
      Cat cat = (Cat)animal; 
      cat.meow(); 
     } 
    } 
} 

Как вы можете видеть, как вы создали класс AnimalAdapter, который абстрагируется от конкретных методов класса Dog и Cat, и этот класс является abstract класс в своем собственном правильно. Это может быть примерно так:

public void doSomething() 
{ 
    AnimalAdapter.speak(new Dog()); 
} 
0

Это зависит от архитектуры, которую вы используете. Если вы используете чистый TDD после SRP с инжектором конструктора, тогда ответ не рекомендуется, так как каждая зависимость должна быть введена из конструктора. Если вам нужен фасад в этом случае, используйте абстрактный (или обычный) заводской шаблон и Aggregate Services/Facade Service.

Это связано с тем, что в чистых TDD и SRP изменчивое свойство не допускается, поэтому дополнительное свойство в интерфейсе нарушает дизайн. Такие как:

public interface IFacade{ 
    IClass1 Class1{get;set;} // not allowed 
    void DoFacade(); 
} 

Не разрешено.

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

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