【问题标题】:Java Design Patterns: FacadeJava 设计模式:外观
【发布时间】:2012-05-11 11:16:06
【问题描述】:

我正在尝试制作一个简单的排序系统,因为它是一个分配,所以我不应该制作 DB 和 GUI,但我需要实现至少 4 种设计模式。我的一个决定是使用 Facade。据我了解,Facade 类是一种控制器,这就是我目前所拥有的:

package model;

import java.util.ArrayList;

public class Facade {
ClientsList clients;
OrdersList orders;
ProductsList products;
ArrayList<Orders> orderlist;
public Facade() {
    clients = new ClientsList();
    orderlist=new ArrayList<Orders>();
    orders = new OrdersList(orderlist);
    products = new ProductsList();

}

public int ClientsSize() {

    return clients.size();
}

public int OrdersSize() {

    return orders.size();
}

public void addClients(Clients client) {
    clients.add(client);

}

public void addOrders(Orders order) {
    orders.add(order);
}

public void removeClients() {
    clients.remove();

}

public void removeOrders() {
    orders.remove();

}

public String next() {
    return orders.it();
}
}

我的模型包中的其他类是 Orders、OrdersList、Clients、Clientslist、Products 和 ProductsList,在 *List 类中,我将信息保存在 ArrayList 中。所以我的问题是:这段代码是门面吗?

【问题讨论】:

    标签: java design-patterns facade


    【解决方案1】:

    外观应该使我不知道某些类及其实现的操作。在您的示例中,我可能不需要了解 ClientList,但我确实需要了解 Client、Product 和 Order。如果这些课程对我隐藏起来会更好,所以我只需要与门面交谈。

    【讨论】:

      【解决方案2】:

      编写一个额外的接口,这样开发人员就不必使用外观的实现:

      public interface OrderService {
          //methods your co-developers should be able to use
      }
      
      public class Facade implements OrderService {
          //methods your co-developers dont want to know about
      }
      

      在您的代码中使用接口而不是实现。

      【讨论】:

      【解决方案3】:

      外观的目标是屏蔽特定组件中功能的实现。外观通常为“外部世界”提供接口。我不知道你的其余代码,但上面的例子可能是一个门面。

      假设您正在构建一个从社交媒体获取消息的组件。您可以使用“GetMessage(字符串关键字)”方法构建外观,该方法(显然)返回消息列表,而不管社交媒体来源如何。这个组件的客户端并不关心组件如何从社交媒体获取数据,他只想要消息。可以隐藏诸如“SearchFacebook”或“SearchTwitter”之类的方法,因为客户端对调用这些方法没有兴趣。但是,“GetMessages”可以使用它们搜索 Facebook 和 Twitter,构建这两个结果的列表并将其返回给客户端。

      另一个很好的例子,请查看 wiki 页面:http://en.wikipedia.org/wiki/Facade_pattern

      【讨论】:

        【解决方案4】:

        立面的意图:

        1. 为子系统中的一组接口提供统一的接口。 Facade 定义了一个更高级别的接口,使子系统更易于使用。

        2. 用更简单的接口封装复杂的子系统。

        您提供的功能与以上几点相匹配,所以在我看来它是一个门面。

        在您的示例中,您通过 Facade 公开子系统(OrdersList、ProductsList)功能。

        【讨论】:

          【解决方案5】:

          要了解更多关于外观设计模式的知识,请阅读“Head First Design Patterns”

          【讨论】: