什么是立面设计模式?

kev*_*vin 182 design-patterns facade

门面里面包含了很多其他类的一类?

是什么使它成为一种设计模式?对我来说,这就像一个普通的课程.

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

Unm*_*kar 183

设计模式是解决重复出现问题的常用方法.所有设计模式中的类都只是普通类.重要的是它们的结构如何以及如何以最佳方式协同解决特定问题.

外观设计图案简化了接口到一个复杂的系统; 因为它通常由构成复杂系统子系统的所有类组成.

甲门面从该系统的复杂细节遮蔽用户并为他们提供一个simplified view它是easy to use.它也是decouples从子系统的细节使用系统的代码,使以后更容易修改系统.

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

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

此外,在学习设计模式时,重要的是能够识别哪种模式适合您给定的问题,然后适当地使用它.滥用模式或试图将其与某些问题相匹配是非常常见的,因为你知道它.使用设计模式学习\时要注意这些陷阱.

  • $ in jquery只是外观设计模式的简单示例,它提供简单的界面并隐藏所有复杂性 (29认同)
  • @kevin:知道何时使用它们是最困难的部分.从理论上讲,模式可能很容易,但实际上它们很难实现.你只能学习这种体验,即.编码,编码,编码. (9认同)

Erd*_*zer 94

维基百科有一个很好的Facade模式的例子.

/* 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的例子.客户需要能够将外观中的所有步骤拼凑在一起,如果他们也选择,则不应该通过私有方法隐藏任何内容. (6认同)
  • Imho这不是一个很好的例子,因为它没有强调用例.正如TO所说,这个例子只是一个常规课程.与硬件的关联是一种组合.对维基上的例子可能有点过分,但是使用依赖注入而不是实例化子模块会强调意图并可能避免TO的混乱. (2认同)

Ara*_*ind 41

如前面的答案中所解释的,它为消费客户端提供了一个简单的界面.例如:"观看ESPN"是预期的功能.但它涉及以下几个步骤:

  1. 如果需要,可以打开电视;
  2. 检查卫星/电缆功能;
  3. 如果需要,切换到ESPN.

但是外观将简化这一点,并为客户提供"观看ESPN"功能.


Kav*_*viK 29

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");
       }
  }
Run Code Online (Sandbox Code Playgroud)


Aru*_*aaj 17

一个简短而简单的解释:

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

尝试了解有或没有Façade的场景:
如果你想把钱从accout1转移到account2,那么要调用的两个子系统是从account1撤出并存入账户2.

有没有门面


llM*_*Mll 10

不应将外观描述为包含许多其他类的类.它实际上是这个类的接口,应该使类的使用更容易,否则外观类是无用的.


Rav*_*abu 7

关于你的疑问:

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

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

是什么使它成为一种设计模式?对我来说,它就像一个普通的课程

所有设计模式也都是普通类.@ Unmesh Kondolikar正确地回答了这个问题.

你能解释一下这个Facade,我是设计模式的新手.

据GoF称, Facade的设计模式被定义为:

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

外观图案,通常使用时:

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

让我们以cleartrip网站为例.

本网站提供预订选项

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

代码段:

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){

    }
}
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
    Run Code Online (Sandbox Code Playgroud)
  3. 来自TravelFacade的book API在内部调用子系统的API

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 通过这种方式,TravelFacade可以提供更简单,更简单的API,而不会暴露子系统API.

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

  1. Facade模式更像是客户端应用程序的帮助
  2. Facade模式可以应用于任何开发点,通常是当接口数量增加且系统得到补充 x时.
  3. 子系统接口不知道Facade,它们不应该有Facade接口的任何引用
  4. Facade模式应该应用于类似的接口,其目的是提供单个接口而不是多个接口来完成类似的工作

看看源代码文章也是为了更好地理解.


Aim*_*Kai 6

Facade模式是结果中许多其他接口的包装器,以生成更简单的接口.

设计模式很有用,因为它们可以解决重复出现的问题并且通常可以简化代码.在同意使用相同模式的开发人员团队中,它可以在维护彼此代码时提高效率和理解.

尝试阅读更多模式:

外观模式:http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

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


Ana*_*tel 6

Façade模式的另一个用途可能是减少团队的学习曲线.让我给你举个例子:

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

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


小智 5

外观的另一个示例:假设您的应用程序连接到数据库并在 UI 上显示结果。您可以使用 Facade 使您的应用程序可配置,就像使用数据库或模拟对象运行一样。因此,您将对外观类进行所有数据库调用,在该类中它将读取应用程序配置并决定触发 db 查询或返回模拟对象。这样,如果数据库不可用,应用程序就变得独立于数据库。


小智 5

外观暴露了大多数调用的简化函数,实现隐藏了客户本来必须处理的复杂性.一般来说,实现使用多个包,类和函数.良好的外观使得其他类的直接访问很少见.例如,当我访问ATM并提取一些金额时.ATM隐藏它是直接进入自有银行还是通过协商网络进行外部银行.ATM就像一个门面消耗多个设备和子系统,作为客户端我不必直接处理.


Jor*_*nev 5

有一个非常好的现实生活中的模式例子吗?-汽车启动引擎

作为司机,我们只需打开钥匙,汽车就启动了。尽可能简单。在幕后,许多其他汽车系统(如电池、发动机、燃料等)都参与其中,以便汽车成功启动,但它们隐藏在启动器后面。

如您所见,汽车启动器是 Facade。它为我们提供了易于使用的界面,而无需担心所有其他汽车系统的复杂性。

让我们总结一下:

Facade 模式简化并隐藏了大型代码块或 API 的复杂性,提供了一个更清晰、易于理解和易于使用的界面。