Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java设计模式:Facade_Java_Design Patterns_Facade - Fatal编程技术网

Java设计模式:Facade

Java设计模式:Facade,java,design-patterns,facade,Java,Design Patterns,Facade,我正在尝试创建一个简单的排序系统,因为这是一个赋值,所以我不应该创建DB和GUI,但我需要实现至少4种设计模式。我的决定之一是使用Facade。据我所知,Facade类是一种控制器,这就是我目前所拥有的: package model; import java.util.ArrayList; public class Facade { ClientsList clients; OrdersList orders; ProductsList products; ArrayList<Orde

我正在尝试创建一个简单的排序系统,因为这是一个赋值,所以我不应该创建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();
}
}
包模型;
导入java.util.ArrayList;
公共类门面{
客户名单客户;
订单列表订单;
产品列表产品;
ArrayList订单列表;
公共立面(){
clients=newclientslist();
orderlist=新的ArrayList();
订单=新订单列表(订单列表);
产品=新产品列表();
}
public int ClientsSize(){
返回clients.size();
}
public int ordersize(){
退货订单。大小();
}
公共无效添加客户端(客户端){
客户。添加(客户);
}
公共无效添加命令(命令){
订单。添加(订单);
}
public void removeClients(){
clients.remove();
}
公共无效解除令(){
orders.remove();
}
公共字符串next(){
返回订单。it();
}
}

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

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

假设您正在构建一个从社交媒体获取消息的组件。您可以使用“GetMessage(string关键字)”方法构建一个facade,该方法(显然)返回消息列表,而不考虑社交媒体源。该组件的客户端不关心该组件如何从社交媒体获取数据,他只需要消息。像“SearchFacebook”或“SearchTwitter”这样的方法可以隐藏,因为客户端对调用这些方法没有兴趣。然而,“GetMessages”可以使用它们搜索Facebook和Twitter,建立这两个网站的搜索结果列表并返回给客户端

另一个很好的例子是,查看wiki页面:

facade的意图:

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

  • 用一个简单的接口包装一个复杂的子系统

  • 您提供的功能与上述要点相匹配,因此在我看来,这是一个门面


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

    Facade应该保护我不了解某些类及其实现的操作。在您的示例中,我可能不需要了解ClientList,但我确实需要了解客户、产品和订单。如果这些类被隐藏起来不让我看到,那就更好了,所以我只需要和facade谈谈。

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

    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
    }
    

    在您的代码中,使用接口而不是impl。

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

    奇怪的是,我看到了一些示例和书籍,它们描述了facade模式,甚至没有提到这一点。否则,这是一个关键的OO原则+我感谢你提及此事。例如: