本文介绍: 外观模式(Facade Pattern)是一种结构型设计模式,它为系统中的一组复杂子系统提供一个简单的接口,从而隐藏了这些子系统的复杂性,并且使得代码更加易于使用和理解。外观模式的核心思想是将复杂的系统拆分成多个子系统,每个子系统负责一个特定的任务。然后,外观类作为这些子系统的总管,将它们组织起来,提供一个简单的接口供客户端使用。这样一来,客户端就不需要了解系统内部的复杂性和细节,只需要通过外观类提供的简单接口来访问系统即可。这种方式可以有效地降低系统的耦合度,使得系统更加易于维护和扩展。

目录

一、前言

二、外观模式

三、总结


一、前言

        外观模式(Facade Pattern)是一种结构型设计模式,它为系统中的一组复杂子系统提供一个简单的接口,从而隐藏了这些子系统的复杂性,并且使得代码更加易于使用和理解。

        外观模式的核心思想是将复杂的系统拆分成多个子系统,每个子系统负责一个特定的任务。然后,外观类作为这些子系统的总管,将它们组织起来,提供一个简单的接口供客户端使用。这样一来,客户端就不需要了解系统内部的复杂性和细节,只需要通过外观类提供的简单接口来访问系统即可。这种方式可以有效地降低系统的耦合度,使得系统更加易于维护和扩展。

二、外观模式

        比如对于基金而言,买卖基金就相当于是个外观模式,对于买卖基金,可以看做是一个外观类,我们不需要过多去关心基金里面的股票、债券等的买卖,从而让我们理财变得更加轻松。根据外观模式的特点可以有类图:

        首先需要我们写好子系统的类:

public class StockSubSystemOne {

    public void buy(){
        System.out.println("股票一买入");
    }

    public void sell(){
        System.out.println("股票一卖出");
    }
}
public class StockSubSystemTwo {
    public void buy(){
        System.out.println("股票二买入");
    }

    public void sell(){
        System.out.println("股票二卖出");
    }
}
public class BondSubSystemOne {
    public void buy(){
        System.out.println("债券一买入");
    }

    public void sell(){
        System.out.println("债券一卖出");
    }
}
public class BondSubSystemTwo {
    public void buy(){
        System.out.println("债券二买入");
    }

    public void sell(){
        System.out.println("债券二卖出");
    }
}

        接着编写我们的外观基金类:

public class FundFacade {
    private StockSubSystemOne stockSubSystemOne;

    private StockSubSystemTwo stockSubSystemTwo;

    private BondSubSystemOne bondSubSystemOne;

    private BondSubSystemTwo bondSubSystemTwo;

    public FundFacade(){
        stockSubSystemOne = new StockSubSystemOne();
        stockSubSystemTwo = new StockSubSystemTwo();
        bondSubSystemOne = new BondSubSystemOne();
        bondSubSystemTwo = new BondSubSystemTwo();
    }

    public void buyFund(){
        stockSubSystemOne.buy();
        stockSubSystemTwo.buy();
        bondSubSystemOne.buy();
        bondSubSystemTwo.buy();
    }

    public void sellFund(){
        stockSubSystemOne.sell();
        stockSubSystemTwo.sell();
        bondSubSystemOne.sell();
        bondSubSystemTwo.sell();
    }

}

        最后是客户端调用类:

public class FacadeClient {
    public static void main(String[] args) {
        FundFacade fundFacade = new FundFacade();

        fundFacade.buyFund();

        fundFacade.sellFund();
    }
}

        运行结果:

三、总结

        其中几个关键角色:

1. 外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,封装了系统中多个子系统的复杂性。外观类知道哪些子系统负责处理哪些请求,将客户端的请求委派给相应的子系统进行处理。

2. 子系统(Subsystem):子系统是指系统中的多个模块或类,每个子系统负责一个特定的任务。子系统并不知道外观类的存在,它们只是被外观类组织起来,为外部提供服务。

3. 客户端(Client):客户端是指使用系统的调用者,它通过外观类提供的简单接口来访问系统,而不需要了解系统内部的复杂性和细节。

        在外观模式中,外观类扮演了重要的角色,它是整个系统的门面,提供了一个简单、统一的接口,隐藏了系统内部的复杂性。而子系统则负责具体的实现,它们被外观类组织起来,为外部提供服务。客户端则通过外观类来访问子系统,从而完成自己的任务。

        优点与缺点:

优点:

1. 简化了系统的调用方式:外观类提供了一个简单的接口,隐藏了系统内部的复杂性。客户端只需要通过外观类来访问子系统,不需要了解子系统的实现细节,从而简化了系统的调用方式。

2. 降低了系统的耦合度:外观模式将子系统和客户端解耦,减少了它们之间的依赖关系。这样一来,系统的维护和扩展就更加容易,也提高了系统的灵活性。

3. 提高了代码的可重用性:外观类封装了系统内部的复杂性,使得系统的各个部分可以独立地进行开发和测试。这样一来,每个子系统都可以被重复利用,提高了代码的可重用性。

4. 易于扩展和维护:外观模式将系统拆分成多个子系统,每个子系统都可以独立地进行扩展和维护。这样一来,系统的整体扩展和维护也变得更加容易。

缺点:

1. 可能会导致性能问题:外观模式会增加一个额外的间接层,可能会影响系统的性能。因此,在设计系统时需要权衡使用外观模式的优点和缺点。

2. 不符合单一职责原则:外观类的职责较大,可能会包含多个子系统的逻辑。这可能会导致外观类的复杂性增加,不符合单一职责原则。

3. 可能会隐藏系统的复杂性:外观模式通过封装系统的复杂性来简化系统的调用方式,但是这也可能会导致客户端对系统的实现细节缺乏了解,不利于系统的优化和调试。

        使用场景:

1. 当系统包含多个子系统时,可以使用外观模式将这些子系统组合成一个整体,为客户端提供简单的接口。这样一来,客户端就可以通过外观类来访问子系统,而不需要了解子系统的实现细节。

2. 当系统的接口复杂或难以理解时,可以使用外观模式对接口进行封装,使其更易于理解和使用。外观类可以将复杂的接口转换成更直观的接口,从而提高系统的易用性。

3. 当需要对系统进行重构时,可以使用外观模式将系统进行拆分和重组。外观类可以将系统拆分成多个子系统,每个子系统都可以独立地进行开发和测试。这样一来,系统的整体扩展和维护也变得更加容易。

4. 当需要对系统进行封装和保护时,可以使用外观模式来限制客户端对系统的直接访问。外观类可以对系统进行封装,限制客户端的访问权限,从而提高系统的安全性。

5. 当需要为一个复杂系统提供一个简单的接口时,可以使用外观模式来为系统提供一个高层次的抽象。外观类可以将系统的复杂性隐藏起来,为客户端提供一个简单的接口,从而降低系统的使用难度。

原文地址:https://blog.csdn.net/qq_41061437/article/details/135628047

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_58580.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注