外观图案 - 返回原始对象或修改后的原始对象

时间:2014-01-21 10:39:18

标签: java design-patterns

我有例如像这样的对象:

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?
}
}

所以,我有两个问题:

1,通过例如构造函数选择原始对象或修改后的原始对象是不错的解决方案boolean getDirectObject?

2,如何轻松返回必须映射到OriginalFacade对象的原始对象      我必须实现原始对象的所有方法吗?

3 个答案:

答案 0 :(得分:3)

实际上,Facade模式使用客户端使用的通用接口。

例如:

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();
    }
}

客户端应该只需要查看Facade接口,而不需要关心他们正在处理的实际实现。

答案 1 :(得分:1)

您的代码表明您根本不了解Facade 首先,应使用Facade为复杂算法提供简单的界面。

其次,Facade模式允许您访问其组合对象,例如:

public class OriginalFacade{
  public Original original;
}

除非您遵循Law of Demeter,否则此代码完全有效。 无论如何,如果使用Facade,您不需要访问这些对象。

以下链接解释了Facade的一点点 我建议你购买并阅读book

答案 2 :(得分:1)

Facade不是这里使用的模式。它用于使复杂的界面更简单,例如,制作开箱即用的使用模式。

在您的情况下,为什么不直接扩展Original类并重载您想要表现不同的方法?