Java设计模式:Facade
我正在尝试创建一个简单的排序系统,因为这是一个赋值,所以我不应该创建DB和GUI,但我需要实现至少4种设计模式。我的决定之一是使用Facade。据我所知,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
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公开了子系统(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原则+我感谢你提及此事。例如: