外观模式的最佳实践是什么?

4

我的代码已经能够运行,但是我不知道我的实现方式是否恰当。基本上,我想保持模式而不违反它。

代码如下:

包模型(省略了设置器/获取器):

public class CA {
    private Integer in;
    private Integer jn;
}

public class CB {
    private Integer kn;
    private Integer ln;
}

public class CC {    
    private static CC instancia;
    private CA a;
    private CB b;

    public static CC getInstancia() {
         if(instancia == null) {
             instancia = new CC();          
         }

         return instancia; 
    }
}

企业套餐:

class CCBusiness {

    static CC c = CC.getInstancia();

    void alter(Integer input) {
        c.getCA.setIn(input);
        Integer num = c.getCB.getLn();
    }
}

包门面:
class FacadeOne {

void methodOne() {
    CCBusiness.alter(1);
    // And more xxBusiness.xx()
}

实际代码更加复杂,但为了解释我的疑惑,我认为这个应该可以工作。
在一个门面中,我调用了几个业务对象,但是是否适当让一个业务(在这种情况下,CC类的业务)修改其他类(在这种情况下,CC内部的类)的属性?我应该创建CABusiness和CBBusiness吗?
因为,据我所知,一个业务不能调用另一个业务,所以第二个业务必须被参数化以接收来自FacadeOne的对象(如果我创建CABusiness和CBBusiness)?

尝试观看这个关于外观模式的YouTube视频教程,我认为它会非常有用!链接:http://www.youtube.com/watch?v=B1Y8fcYrz5o&list=PLF206E906175C7E07。 - Paolo
如果您喜欢某个答案,请随意接受它。 :-) - LastFreeNickname
2个回答

6
我认为有一些澄清可能会对你有所帮助:外观模式可以帮助你拥有一个单一的访问点,用于多个类,这些类被隐藏在外观后面,因此对外部世界不可见。通常,这些类形成某种模块或逻辑单元。
你正在努力理解的是外观背后的结构和它们的层次结构。如果不知道整个情况,这很难分析,但根据我所了解的信息,最好是有几个业务类,可以从外观中单独调用。在业务对象之间创建交叉调用将增加代码混乱的机会。
至于最佳实践和技术,最简单的方法是绘制类的草图,这通常可以澄清很多问题。这样你已经完成了基于UML的文档的一半。 :-)
顺便说一下,要避免给你的类命名为CA、CB等。这与将变量命名为a001、a002等是一样的...使用有意义的名称可以大大提高可读性!

感谢您的推荐,画草图对我定义每个类有很大帮助。每个模型类只能有一个业务类吗?我的意思是,不能有一个业务类修改两个或更多的模型类吗? - guille8

3
拥有一个Facade后,您可以通过调用多个CxBusiness对象并将它们的操作集成为一个有意义的结果。这就是Facade的目的,通过在一个简洁和清晰的操作methodOne中隐藏5个不同组件之间的交互来简化与业务层的交互。
然而,对于单个的CxBusiness,您应该避免相互之间的调用;否则,您将面临一个可能会遇到循环引用的复杂依赖结构。将每个CxBusiness作为每个Cx模型的唯一包装器,并将它们与其他模块分开,以减少与它们交互时产生的不必要的副作用。这些模块之间的任何交互都将在Facade中进行。
此外,通过依赖于接口而不是具体类(如ICABusiness,ICCBusiness等),强制实施此模式。然后,访问任何模型的唯一方法应该是通过这些接口,显然,您不应该有一个具有ICxBusiness成员的具体CxBusiness(无交叉依赖)。一旦您设置了这些限制,实现本身将流向更模块化和更少耦合的设计。

感谢您的建议。在我的项目中创建了Facade之后,我发现业务类比没有使用Facade时有更少的逻辑代码。我的意思是,大多数业务类只有像“getXX”或“setXX”这样的方法。这是正常的吗?还是我做错了什么? - guille8
并不是必须的,记住这只是一种将这些操作隔离开来的方式,以便任何人都可以正确地重用它们而不会出现意外行为或副作用。然而,如果不了解您实现的实际细节,很难提出建议... - rae1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接