文章优先发表在个人博客,后续如果更新忘记同步抱歉。
个人博客本篇文章地址:https://www.xdx97.com/article/707951089365811200
一、引出外观模式
比如我们要弄一个电影院,里面有幕布、投影仪、折叠椅等。
开始:放下幕布、打开投影仪、打开折叠椅
中间:开始播放
结束:关闭幕布、关闭投影仪、关闭折叠椅
设计这个系统
1、我们可以把幕布、投影仪、折叠椅,看成一个小的系统,它里面又有具体的相关操作。
2、我们有一个客户端,比如开始的时候。我们就去调用幕布的打开方法,投影仪的打开方法,折叠椅的打开方法。
3、同理我们的中间、结束也都是调用相对应的操作方法。
这样存在一个问题就是:
- 客户端调用起来麻烦
- 当开始过程新增了一个操作,客户端也要对应的去做出改变。
- 图示就是这样,我们用户直接进行相对应的操作
二、外观模式
外观模式理解起来很简单,就是我们对其提出一个操作类,让用户去操作我们的操作类。不让其直接使用对应的方法。在上面的例子中,用户只需要知道我们有三个方法就好了。开始、中间、结束至于这里面具体的操作我们用户不需要知道。
注:幕布、投影仪、折叠椅都是使用单例模式进行构造
Curtain(幕布)
public class Curtain {
private Curtain(){}
private static final Curtain curtain = new Curtain();
public static Curtain getCurtain(){
return curtain;
}
// 打开幕布
public void openCurtain(){
System.out.println("打开幕布....");
}
// 打开幕布
public void closeCurtain(){
System.out.println("关闭幕布....");
}
}
Projector(投影仪)
public class Projector {
private Projector(){}
private static final Projector projector = new Projector();
public static Projector getProjector(){
return projector;
}
// 打开投影仪
public void openProjector(){
System.out.println("打开投影仪....");
}
// 开始播放
public void startPlaying(){
System.out.println("开始播放....");
}
// 打开投影仪
public void closeProjector(){
System.out.println("关闭投影仪....");
}
}
FoldingChair (折叠椅)
public class FoldingChair {
private FoldingChair(){}
private static final FoldingChair foldingChair = new FoldingChair();
public static FoldingChair getFoldingChair(){
return foldingChair;
}
// 打开投影仪
public void openFoldingChair(){
System.out.println("打开折叠椅....");
}
// 打开投影仪
public void closeFoldingChair(){
System.out.println("关闭折叠椅....");
}
}
movie (电影 我们的中间层)
public class Movie {
private Curtain curtain = Curtain.getCurtain();
private FoldingChair foldingChair = FoldingChair.getFoldingChair();
private Projector projector = Projector.getProjector();
// 开始
public void start(){
// 打开幕布
curtain.openCurtain();
// 打开投影仪
projector.openProjector();
// 打开折叠椅
foldingChair.openFoldingChair();
}
// 中间
public void middle(){
projector.startPlaying();
}
// 结束
public void end(){
// 打开幕布
curtain.closeCurtain();
// 打开投影仪
projector.closeProjector();
// 打开折叠椅
foldingChair.closeFoldingChair();
}
}
测试
public class Main {
public static void main(String[] args) {
Movie movie = new Movie();
// 开始
movie.start();
// 中间
movie.middle();
// 结束
movie.end();
}
}
总结
- 关于外观模式我们很容易就去理解了。就是套一个壳子嘛
- 当了我们学一个东西要灵活的运用。如果我们的底层系统就是只有一个。那么我们还需要中间层嘛?