外观模式
1、概念
思想
迪米特法则;依赖倒置原则
定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中的方法,从而外观模式让客户和子系统之间避免了紧耦合。
核心思想
由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统,客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法。
与适配器模式的区别
适配器模式是将一个对象包装起来以改变其接口,而外观是将一群对象“包装”起来以简化其接口。即适配器是将接口转换为不同的接口,而外观模式是提供一个统一的接口来简化接口。
角色
门面(Facade)角色
客户端调用这个角色的方法。该角色知道相关的一个或多个子系统的功能和责任,该角色会将从客户端发来的请求委派带相应的子系统中去。
子系统(subsystem)角色
可以同时包含一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用或被门面角色调用。对于子系统而言,门面仅仅是另外一个客户端,子系统并不知道门面的存在。
2、使用
代码实现
门面(Facade)角色
package com.csk.mode.facade.service;
public class Fund {
Stock1 stock1;
Stock2 stock2;
Stock3 stock3;
NationalDebt1 nationalDebt1;
Realty1 realty1;
public Fund() {
stock1 = new Stock1();
stock2 = new Stock2();
stock3 = new Stock3();
nationalDebt1 = new NationalDebt1();
realty1 = new Realty1();
}
public void buyFund(){
stock1.buy();
stock2.buy();
stock3.buy();
nationalDebt1.buy();
realty1.buy();
}
public void sellFund(){
stock1.sell();
stock2.sell();
stock3.sell();
nationalDebt1.sell();
realty1.sell();
}
}
子系统(subsystem)角色
package com.csk.mode.facade.service;
public class Stock1 {
public void sell(){
System.out.println("股票1卖出");
}
public void buy(){
System.out.println("股票1买进");
}
}
package com.csk.mode.facade.service;
public class Stock2 {
public void sell(){
System.out.println("股票2卖出");
}
public void buy(){
System.out.println("股票2买进");
}
}
package com.csk.mode.facade.service;
public class Stock3 {
public void sell(){
System.out.println("股票3卖出");
}
public void buy(){
System.out.println("股票3买进");
}
}
package com.csk.mode.facade.service;
public class NationalDebt1 {
public void sell(){
System.out.println("国债1卖出");
}
public void buy(){
System.out.println("国债1买进");
}
}
package com.csk.mode.facade.service;
public class Realty1 {
public void sell(){
System.out.println("房地产1卖出");
}
public void buy(){
System.out.println("房地产1买进");
}
}
启动类
package com.csk.mode.facade.controller;
import com.csk.mode.facade.service.*;
public class FacadeMain {
public static void main(String[] args) {
Fund fund = new Fund();
// 基金购买
fund.buyFund();
// 基金赎回
fund.sellFund();
}
}
截图
使用场景
1、为一个复杂的子系统提供一个简单的接口;
2、提供子系统的独立性;
3、在层次化结构中,可以使用外观模式定义系统中每一层的入口。例如:三层架构;
优缺点
优点
1、外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
2、外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
缺点
如果增加新的子系统可能需要修改外观类代码和客户端的源代码。违背了“开闭原则”。----不可避免