走穿java23钟设计模式-11外观模式
外观模式也叫门面模式,是一种比较常用同时也非常简单的设计模式。
一.现实场景
李文在一家外资企业上班,担任总经理秘书。总经理第二天要去美国,吩咐他办理相关事项,李文马上去预定机票、联系酒店、整理文件等。把所有事情安排得井井有条,总经理能第二天顺利前往美国,得到了总经理的认可。
在上面的场景中,老板什么事情都找秘书做,自己不需要知道事情处理的细节,只要知道结果即可,这类似于设计模式中的外观模式。
二.外观模式(Facade Pattern)的定义
要求一个子系统的外部与其内部的通信必须要通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易使用。
三.外观模式的类图
外观模式注重“统一”的对象,即提供一个访问子系统的接口,只有通过该接口才能访问子系统的行为发生
外观模式看起来是很简单,但是很多过程都是封装在子系统角色中的。
三.外观模式的两种角色
1.外观角色(Facade)
客户可以调用该角色的方法,该角色知晓相关子系统的功能和责任。正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,即该角色没有任何实际的业务逻辑,只有一个委托类。
2.子系统角色(Subsystem)
可以同时存在一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。子系统不知道外观角色的存在,对于子系统而言,外观角色仅仅四一个客户端而已。
也就是说,上面现实示例中的秘书,只是干秘书该干的事情,不管老板是谁。
四.外观模式的优点
1.减少系统的相互依赖关系。所有的依赖都是对Facade对象的依赖,与子系统无关。
2.提高灵活性。不管子系统内部如何变化,只要不影响Facade对象,任何活动都是自由的。
3.提高安全性。在Faacde中未提供的方法,外界无法访问,提高了系统的安全性。
外观模式的缺点就是不符合开闭原则。开闭原则是:对修改关闭,对扩展开放。
五.外观模式的使用场景
1.为一个复杂的模块或子系统提供一个供外界访问的接口。
2.子系统相对独立,外界对子系统的访问只需要黑箱操作即可。
3.预防风险扩散,使用Facade进行访问控制。
六.外观模式的理解
外观模式,简单点理解就是java三大特征中封装性的具体体现。
这个外观模式和代理模式也是非常非常的相似啊。
外观模式的现实示例
这里以上面的现实场景:老板叫秘书安排去出差的基本事项。为示例代码
现实示例的类图
现实示例的代码
1.机场类Airport
package p11_facade;
/**
* 飞机场对象类
*/
public class Airport {
public void bookTicket(String from, String to) {
System.out.println("订购了从" + from + "到" + to + "的机票");
}
}
2.酒店类Hotel
package p11_facade;
/**
* 酒店类
*/
public class Hotel {
public void bookRoom(int days) {
System.out.println("订了" + days + "天的酒店");
}
}
3.司机类Chauffeur
package p11_facade;
/**
* 司机类
*/
public class Charffeur {
public void drive(String to) {
System.out.println("司机开车去 " + to);
}
}
4.秘书类Secretary
package p11_facade;
/**
* 秘书类
*/
public class Secretary {
//定义可以操作的对象
private Charffeur charffeur=new Charffeur();
private Hotel hotel=new Hotel();
private Airport airport=new Airport();
//安排出差,实际是调用不同对象做特定的事情
public void travel(String to,int days){
airport.bookTicket("青岛",to);
charffeur.drive("机场");
hotel.bookRoom(days);
}
}
5.老板类Boss
package p11_facade;
/**
* 外观模式测试类
*
* Boss类
*/
public class Boss {
public static void main(String[] args){
System.out.println("老板告诉秘书要到美国出差10天");
//创建秘书对象,
Secretary secretary=new Secretary();//实际里面还有其他对象已经创建完成了
secretary.travel("美国",10);//安排
}
}
程序运行结果
外观模式就为大家介绍到这里。
大家如果对其他设计模式有兴趣可以看看我之前的博客:
10桥梁模式:
9组合模式:http://blog.csdn.net/wenzhi20102321/article/details/78463190
8适配器模式:http://blog.csdn.net/wenzhi20102321/article/details/78389326
7装饰模式:http://blog.csdn.net/wenzhi20102321/article/details/78336273
6代理模式:http://blog.csdn.net/wenzhi20102321/article/details/78209493
创建型模式详解:http://blog.csdn.net/wenzhi20102321/article/details/78175558
5原型模式:http://blog.csdn.net/wenzhi20102321/article/details/78167984
4建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855
3抽象工厂模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
2工厂方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
可以仔细对比一下工厂方法模式和抽象工厂模式,看看概念,看看类图,看看代码,就会明白了。
1单例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203
java 23种设计模式介绍:http://blog.csdn.net/wenzhi20102321/article/details/54601909