目录
一、前言
二、外观模式
三、总结
一、前言
外观模式(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. 当需要为一个复杂系统提供一个简单的接口时,可以使用外观模式来为系统提供一个高层次的抽象。外观类可以将系统的复杂性隐藏起来,为客户端提供一个简单的接口,从而降低系统的使用难度。