外观模式(Facede)
2020-07-22 本文已影响0人
秀儿2020
定义
为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,使得这一子系统更加容易使用。
本质
封装交互,简化调用。
登场角色
-
Facede(窗口)
定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。
-
模块
接收Facade对象的委托,真正实现功能,各个模块之间可能会有交互。
示例代码
public interface Phone {
void dail(); //拨打
void hangup();//挂断
}
public class PhoneImpl implements Phone{
@Override
public void dail() {
System.out.println("拨号");
}
@Override
public void hangup() {
System.out.println("挂断");
}
}
public interface Camera {
void open();
void takePicture();
void close();
}
public class SamsungCamera implements Camera{
@Override
public void open() {
System.out.println("打开相机");
}
@Override
public void takePicture() {
System.out.println("拍照");
}
@Override
public void close() {
System.out.println("关闭相机");
}
}
public class MobilePhone {
private Phone phone = new PhoneImpl();
private Camera camera = new SamsungCamera();
public void dail(){
phone.dail();
}
public void videoChat(){
camera.open();
phone.dail();
}
public void hangup(){
phone.hangup();
}
public void takePickture(){
camera.open();
camera.takePicture();
}
public void closeCamera(){
camera.close();
}
}
public class Main {
public static void main(String[] args){
MobilePhone mobilePhone = new MobilePhone();
System.out.println("=======拍照=======");
mobilePhone.takePickture();
System.out.println("=======视频通话=======");
mobilePhone.videoChat();
}
}
运行结果
=======拍照=======
打开相机
拍照
=======视频通话=======
打开相机
拨号
功能
提供统一的封装接口,将子系统的逻辑、交互隐藏起来,为用户提供一个高层次的接口,使得系统更加易用,同事也对外隐藏了具体的实现,这样即使子系统发生了改变,用户也不会感知到,因为用户使用的是高层接口,内部的变化对用户不可见。
优点
- 松散耦合,松散了客户端和子系统的耦合关系。
- 简单易用,客户端不需要了解子系统内部的实现,也不需要跟子系统内部的多个模块进行交互,只需要更外观交互即可。
- 更好的划分访问的层次。有些方法是对系统外开放的,有些方法是仅对系统内使用的,使用外观模式可以将可对外调用的功能集中到外观模式中,也很好的隐藏了实现的细节。
缺点
- 过多的或者不太合理的Facede或让人疑惑,到底是调用外观呢还是直接调用内部实现呢。
何时使用
- 为一个复杂的子系统提供一个简单的接口。
- 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,可以让他们仅通过外观模式相互调用,简化他们之间的依赖关系。