什么是门面devise模式?

Facade是一个包含很多其他类的类吗?

是什么使其成为devise模式? 对我来说,就像一个普通的class级。

你能解释一下这个门面模式吗?

devise模式是解决经常性问题的常用方法。 所有devise模式中的类都只是普通的类。 重要的是它们是如何构build的,以及它们如何一起工作以最好的方式解决给定的问题。

Facadedevise模式简化了与复杂系统的接口; 因为它通常由组成复杂系统子系统的所有类组成。

一个Facade屏蔽用户从系统的复杂细节,并提供了一个simplified view easy to use simplified view 。 它还将使用该系统的代码从子系统的细节中decouples出来,以便稍后修改系统。

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

另外,学习devise模式的重要之处在于能够识别哪种模式适合您的问题,然后适当地使用它。 滥用模式或者仅仅因为知道某个问题而试图解决这个问题是非常普遍的事情。 在学习\使用devise模式时要注意这些缺陷。

维基百科有一个很好的门面模式的例子。

 /* Complex parts */ class CPU { public void freeze() { ... } public void jump(long position) { ... } public void execute() { ... } } class Memory { public void load(long position, byte[] data) { ... } } class HardDrive { public byte[] read(long lba, int size) { ... } } /* Facade */ class ComputerFacade { private CPU processor; private Memory ram; private HardDrive hd; public ComputerFacade() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } public void start() { processor.freeze(); ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE)); processor.jump(BOOT_ADDRESS); processor.execute(); } } /* Client */ class You { public static void main(String[] args) { ComputerFacade computer = new ComputerFacade(); computer.start(); } } 

正如前面的答案中所解释的,它为消费客户提供了一个简单的界面。 例如:“观看ESPN”是预期的function。 但是它涉及到几个步骤:

  1. 如果需要,打开电视;
  2. 检查卫星/电缆的function;
  3. 如果需要切换到ESPN。

但外观将简化这一点,只提供“观看ESPN”function的客户端。

Facade隐藏了系统的复杂性,并为客户端提供了一个从客户端访问系统的接口。

 public class Inventory { public String checkInventory(String OrderId) { return "Inventory checked"; } } public class Payment { public String deductPayment(String orderID) { return "Payment deducted successfully"; } } public class OrderFacade { private Payment pymt = new Payment(); private Inventory inventry = new Inventory(); public void placeOrder(String orderId) { String step1 = inventry.checkInventory(orderId); String step2 = pymt.deductPayment(orderId); System.out .println("Following steps completed:" + step1 + " & " + step2); } } public class Client { public static void main(String args[]){ OrderFacade orderFacade = new OrderFacade(); orderFacade.placeOrder("OR123456"); System.out.println("Order processing completed"); } } 

一个门面不应该被描述成一个包含很多其他类的类。 它实际上是这个类的一个接口,应该使类的使用更容易,否则facade类是没有用的。

外观模式是结果中的许多其他接口的包装,以产生更简单的接口。

devise模式在解决反复出现的问题和简化代码方面很有用。 在同意使用相同模式的开发者团队中,当维护彼此的代码时,它提高了效率和理解。

尝试阅读更多模式:

门面模式: http : //www.dofactory.com/Patterns/PatternFacade.aspx#_self1

或者更一般地说: http : //www.dofactory.com/Patterns/Patterns.aspx

一个外观暴露了大多数被调用的简化函数,而实现隐藏了客户端要处理的复杂性。 一般来说,这个实现使用了多个包,类和函数。写得很好的外观使其他类很less直接访问。 例如,当我访问一台自动柜员机,并提取一些金额。 自动柜员机隐藏着是直接进入所属银行,还是通过谈判达成的外部银行networking。 自动取款机的function就像一个门面,消耗多个设备和子系统,作为客户我不必直接处理。

Facade是一个具有一定级别的function的类,位于工具包和完整的应用程序之间,提供包或子系统中类的简化使用。 Facade模式的意图是提供一个使子系统易于使用的界面。 – 从C#中的书籍devise模式中提取。

另外使用正面模式可以减less你的团队的学习曲线。 让我举一个例子:

让我们假设您的应用程序需要通过使用Excel提供的COM对象模型与MS Excel进行交互。 你的一个团队成员知道所有的Excel API,他在其上创build一个Facade,它满足了应用程序的所有基本场景。 团队中没有其他成员需要花时间学习Excel API。 团队可以使用外观,而无需了解实现scheme所涉及的内部或所有MS Excel对象。 这不是很好吗?

因此,它在一个复杂的子系统之上提供了一个简化和统一的界面。

另外一个例子:说你的应用程序连接到数据库,并在用户界面上显示结果。 您可以使用Facade来使您的应用程序可configuration,如使用数据库运行或使用模拟对象。 所以你将所有的数据库调用到门面类,它将读取应用程序configuration,并决定触发分贝查询或返回模拟对象。 这种方式应用程序成为db独立的情况下数据库不可用。

devise模式是软件devise中给定上下文中常见问题的通用可重用解决scheme。

Facadedevise模式是一种结构模式,因为它定义了在类或实体之间创build关系的方式。 门面devise模式用于为更复杂的子系统定义简化的界面。

当使用大量相互依存的类时,或者需要使用多种方法的类,特别是在使用复杂或难于理解的情况下,门面模式是理想的。 Facade类是一个“包装器”,它包含一系列易于理解和易于使用的成员。 这些成员代表Facade用户访问子系统,隐藏实现细节。

当包装devise不佳的子系统时,外观devise模式特别有用,但由于源代码不可用或现有接口被广泛使用,所以不能重构。 有时您可能会决定实现多个门面以提供不同用途的function子集。

门面模式的一个示例用于将网站与业务应用程序集成。 现有的软件可能包含大量必须以特定方式访问的业务逻辑。 该网站可能只需要有限的访问这个业务逻辑。 例如,网站可能需要显示出售物品是否达到了有限的库存水平。 Facade类的IsLowStock方法可以返回一个布尔值来表示这一点。 在幕后,这种方法可能隐藏了处理当前实物库存,入库库存,分配物品和每个物品的低库存水平的复杂性。

Facade讨论了在一个接口对象中封装一个复杂的子系统。 这减less了成功利用子系统所需的学习曲线。 它也促进了子系统与潜在的许多客户的分离。 另一方面,如果Facade是子系统的唯一访问点,则会限制“强大用户”可能需要的function和灵活性。

所有的devise模式都是以适合特定应用程序的方式安排的。 外观模式的目的是为了隐藏操作或操作的复杂性。 您可以通过http://preciselyconcise.com/design_patterns/facade.php查看示例并了解门面模式;

关于你的查询:

Facade是一个包含很多其他类的类吗?

是。 它是应用程序中许多子系统的包装。

是什么使其成为devise模式? 对我来说,就像一个普通的class级

所有的devise模式也是正常的类。 @ Unmesh Kondolikar正确地回答了这个问题。

你可以向我解释一下这个门面,我是新devise模式。

据GoF介绍, Facade的devise模式定义为:

为子系统中的一组接口提供一个统一的接口。 门面模式定义了一个更高层次的接口,使得子系统更易于使用

门面模式通常用于以下情况:

  1. 访问复杂系统需要一个简单的界面。
  2. 子系统的抽象和实现是紧密耦合的。
  3. 需要一个分层软件的每个级别的入口点。
  4. 系统非常复杂或难以理解。

让我们以一个真实的文字为例,介绍一下cleartrip网站。

本网站提供预订选项

  1. 机票
  2. 酒店
  3. 航class+酒店

代码片段:

 import java.util.*; public class TravelFacade{ FlightBooking flightBooking; TrainBooking trainBooking; HotelBooking hotelBooking; enum BookingType { Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel; }; public TravelFacade(){ flightBooking = new FlightBooking(); trainBooking = new TrainBooking(); hotelBooking = new HotelBooking(); } public void book(BookingType type, BookingInfo info){ switch(type){ case Flight: // book flight; flightBooking.bookFlight(info); return; case Hotel: // book hotel; hotelBooking.bookHotel(info); return; case Train: // book Train; trainBooking.bookTrain(info); return; case Flight_And_Hotel: // book Flight and Hotel flightBooking.bookFlight(info); hotelBooking.bookHotel(info); return; case Train_And_Hotel: // book Train and Hotel trainBooking.bookTrain(info); hotelBooking.bookHotel(info); return; } } } class BookingInfo{ String source; String destination; Date fromDate; Date toDate; List<PersonInfo> list; } class PersonInfo{ String name; int age; Address address; } class Address{ } class FlightBooking{ public FlightBooking(){ } public void bookFlight(BookingInfo info){ } } class HotelBooking{ public HotelBooking(){ } public void bookHotel(BookingInfo info){ } } class TrainBooking{ public TrainBooking(){ } public void bookTrain(BookingInfo info){ } } 

说明:

  1. FlightBooking, TrainBooking and HotelBooking是大型系统的不同子系统: TravelFacade

  2. TravelFacade提供了一个简单的界面来预订以下选项之一

     Flight Booking Train Booking Hotel Booking Flight + Hotel booking Train + Hotel booking 
  3. 来自TravelFacade的书API在内部调用子系统的API

     flightBooking.bookFlight trainBooking.bookTrain(info); hotelBooking.bookHotel(info); 
  4. 通过这种方式, TravelFacade提供了更简单,更简单的API, TravelFacade公开子系统API。

关键要点:(来自Pankaj Kumar的 journaldev文章)

  1. 门面模式更像是客户端应用程序的助手
  2. 通常当接口数量增加,系统变得复杂时 ,门面模式可以应用于任何开发阶段。
  3. 子系统接口不知道Facade,他们不应该有Facade接口的任何参考
  4. 门面模式应该应用于类似types的接口 ,其目的是提供一个单一的接口,而不是多个接口做类似的工作

为了更好的理解,也看看源文章。

它基本上是一个单独的窗口清除系统。您将任何工作委派给另一个class级的特定方法。

可能是门面模式(和许多其他)的最佳解释http://www.jakowicz.com/facade-pattern-in-php/

外观devise模式属于结构devise模式。 总之,立面是指外观。 这意味着我们在Facadedevise模式中隐藏了一些东西,只显示客户需要的东西。 阅读更多在下面的博客: http : //www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html