2014-01-21 2 views
3

У меня есть, например, объект такой:Фасад - возврат оригинального объекта или измененного оригинального объекта

Original obj = new Original(); 

И я использую этот объект, например. метод (этот объект имеет много методов и полей): obj.getMeYourName();

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

Итак, сначала я хочу создать фасад и решил, если я верну прямой объект или изменю. Каков наилучший способ?

Что-то вроде этого:?

Original obj = new Original(); 

OriginalFacade obj = new OriginalFacade(Original obj, boolean getDirectObject); 


OriginalFacade(Original obj, boolean getDirectObject) { 
if (getDirectObject) { 
    return obj //How to convert object into OriginalFacade type? 
} else { 
    obj.setMeYourName("Something else"); 
    return obj; //Howto convert object into OriginalFacade type? 
} 
} 

Так, у меня есть 2 проблемы:

1, это хорошее решение выбрать исходный объект или модифицированный исходный объект через конструктор с, например, boolean getDirectObject?

2, как легко вернуть исходный объект, который я должен отображенный в OriginalFacade объект Должен ли я иметь реализовать все методы от исходного объекта?

ответ

2

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

Например:

public interface Facade { 
    public String getMeYourName(); 
    public void someOtherMethod(); 
} 

public class Original implements Facade { 
    private String name; 

    Original(String name) { 
     this.name = name; 
    } 

    public String getMeYourName() { 
     return name; 
    } 

    public void someOtherMethod() { 
     // a lot of great code 
    } 
} 

public class Modified implements Facade { 
    private Facade original; 
    private String otherName; 

    Modified(Facade original, String otherName) { 
     this.original = original; 
     this.otherName = otherName; 
    } 

    public String getMeYourName() { 
     return otherName; 
    } 

    public void someOtherMethod() { 
     original.someOtherMethod(); 
    } 
} 

Клиенты должны только увидеть интерфейс Фасад, и не должны заботиться, которые фактическая реализация они имеют дело.

1

Ваш код показывает, что вы еще не поняли Facade.
На первом месте Facade следует использовать простой интерфейс для сложных алгоритмов.

Во-вторых, структура фасада позволяет получить доступ к его объекты, состоящие, например:

public class OriginalFacade{ 
    public Original original; 
} 

Если вы не следовать Law of Demeter, этот код является совершенным в силе. Независимо от того, используется ли Facade, вам не нужно обращаться к этим объектам.

Следующая ссылка объясняет немного Facade
Я рекомендую вам купить и прочитать book

1

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

В вашем случае, почему бы вам просто не расширить класс Original и не перегрузить методы, которые вы хотите вести по-другому?

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