Facade是包含许多其他类的类吗?
是什么使它成为一种设计模式?对我来说,它就像一个普通的类。
你能向我解释一下这个Facade模式吗?
Facade是包含许多其他类的类吗?
是什么使它成为一种设计模式?对我来说,它就像一个普通的类。
你能向我解释一下这个Facade模式吗?
设计模式是解决重复性问题的一种常见方法。在所有设计模式中,类都只是普通类。重要的是它们的结构以及如何相互协作以最佳方式解决给定问题。
外观设计模式简化了复杂系统的接口,因为它通常由组成复杂系统子系统的所有类组成。
外观模式保护用户免受系统复杂细节的干扰,并向用户提供易于使用
的简化视图
。它还将使用系统的代码与子系统的详细信息解耦
,使得以后修改系统更容易。
http://www.dofactory.com/Patterns/PatternFacade.aspx
http://www.blackwasp.co.uk/Facade.aspx
此外,在学习设计模式时,重要的是要能够识别哪种模式适用于您的特定问题,然后恰当地使用它。误用模式或者仅仅因为了解而试图将其适用于某些问题是很常见的错误。在学习和使用设计模式时要注意这些陷阱。
维基百科提供了一个很好的外观模式示例。
/* 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"是预期的功能。但它涉及到几个步骤,如下:
但是外观模式将简化这个过程,只向客户端提供“观看ESPN”的功能。
外观模式隐藏了系统的复杂性,并提供了一个接口给客户端,客户端可以通过该接口访问系统。
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是包含许多其他类的类吗?
是的。它是应用程序中许多子系统的包装器。
什么使它成为设计模式?对我来说,它就像一个普通的类
所有设计模式都是普通的类。@Unmesh Kondolikar正确回答了这个问题。
你能给我解释一下这个Facade吗?我对设计模式很新。
根据GoF,Facade设计模式被定义为:
为子系统中的一组接口提供统一的接口。Facade模式定义了一个更高级别的接口,使子系统更易于使用
Facade模式通常在以下情况下使用:
让我们以cleartrip网站为例。
该网站提供预订选项。
代码片段:
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){
}
}
解释:
FlightBooking
、TrainBooking
和HotelBooking
是大型系统TravelFacade
的不同子系统。
TravelFacade
提供了一个简单的接口,以预订以下选项之一:
机票预订
火车票预订
酒店预订
机票+酒店预订
火车票+酒店预订
来自TravelFacade的预订API内部调用子系统的以下API:
flightBooking.bookFlight
trainBooking.bookTrain(info);
hotelBooking.bookHotel(info);
这样,TravelFacade
提供了更简单、更易于使用的API,而不会暴露子系统的API。
有一个非常好的现实生活中的例子展示了这个模式 - 汽车启动器引擎。
作为司机,我们只需打开钥匙,汽车就能启动。如此简单。幕后,许多其他汽车系统参与其中(如电池、发动机、燃料等),以确保汽车成功启动,但它们隐藏在启动器背后。
正如您所看到的,汽车启动器是Facade。它为我们提供易于使用的接口,而不必担心所有其他汽车系统的复杂性。
让我们总结一下:
外观模式简化并隐藏了大型代码块或API的复杂性,提供了更清洁、易于理解和易于使用的接口。