java23中设计模式(1)-facade(门面,外观)模式
写在前面
学习java以来不断听到各种设计模式,各种框架也大量使用模式
面试的时候曾经也被问过关于设计模式的问题,但是一直没有
系统的了解学习过相关知识,在此,将从书中,博客中学到的知识
做一次自我归纳和总结,也为温故知新做好准备材料.
情景设想
假设你需要造一个房子,房子简单的分为地基建设、主体建
设、内部装潢三部(简单例子,不做深究),你分别找到了这么几个
施工团队:
* 黑曜石地基团队 *:用黑曜石打地基的团队
* 白石英主体团队 *:用白石英打造房子主体的团队
* 红石内饰团队 *:用红石打造房子内部装潢的团队
房子如下:
public class House{
private String subgrade;//地基
private String body;//主体
private String ornament;//装饰
//省略getter/setter.....
}
三个团队如下:
public class ObsidianTeam{
public buildSubgrade(House house){
house.setSubgrade("黑曜石地基");
}
}
public class QuartzTeam{
public buildBody(House house){
house.setBody("白石英主体");
}
}
public class RedStoneTeam{
public buildOrnament(House house){
house.setOrnament("红石内饰");
}
}
当我们不考虑设计模式的时候,造房子的流程是这样的
public class BuildTest{
public static void main(String[] args){
//你找来了黑曜石团队
ObsidianTeam obsidianTeam = new ObsidianTeam();
//你找来了白石英团队
QuartzTeam quartzTeam = new QuartzTeam();
//你找来了红石内饰团队
RedStoneTeam redStoneTeam = new RedStoneTeam();
//你的房子
House house = new House();
//黑曜石团队为你的房子建好了地基
obsidianTeam.buildSubgrade(house);
//白石英团队为你的房子建好了主体
quartzTeam.buildBody(house);
//红石内饰团队装饰了你的房子
redStoneTeam.buildOrnament(house);
//看看你的房子
System.out.println("一幢有着"+house.getSubgrade()+","+house.getBody+","+house.getOrnament+"的房子!");
}
}
结果:
一幢有着黑曜石地基,白石英主体,红石内饰的房子!
可以看出,这种编程有很多问题:
1.程序暴露了过多的细节(不涉及用户交互的方法),例如三个团队的建设方法,以及可能更加复杂但是没有写出来的其他方法:三个团队互相商量房子的衔接处的处理等等…
2.当步骤增多的时候,越加难以维护,不够系统
当我们使用facade模式时,我们的代码可以改成这样
这三个团队组成了一个施工团队:
public class BuildTeam{
private static BuildTeam buildTeam = null;
private ObsidianTeam obsidianTeam = null;
private QuartzTeam quartzTeam = null;
private RedStoneTeam redStoneTeam = null;
//私有化构造方法,单例
private BuildTeam(){
obsidianTeam = new ObsidianTeam();
quartzTeam = new QuartzTeam();
redStoneTeam = new RedStoneTeam();
}
//获取施工团队单例
public static BuildTeam getInstance(){
synchronized(BuildTeam.class){
if(buildTeam == null){
buildTeam = new BuildTeam();
}
return buildTeam;
}
}
//建造一幢房子
public void buildHouse(House house){
//调用黑曜石团队为房子建好了地基
obsidianTeam.buildSubgrade(house);
//调用白石英团队为房子建好了主体
quartzTeam.buildBody(house);
//调用红石内饰团队装饰了的房子
redStoneTeam.buildOrnament(house);
}
}
现在,你建造房子的过程变成了这样
public class BuildTest{
public static void main(String[] args){
//你的房子
House house = new House();
//找来施工团队
BuildTeam buildTeam = BuildTeam.getInstance();
//施工团队建造房子
buildTeam.buildHouse(house);
//看看你的房子
System.out.println("一幢有着"+house.getSubgrade()+","+house.getBody+","+house.getOrnament+"的房子!");
}
}
运行结果和之前相同
对比两种方案:
1.前一种方案所有的非交互方法都对用户暴露,远没有后面一种由门面提供统一的接口方法简单
2.前一种的方案提供了更多的可定制的可能,你可以找到黑曜石,青砖,灰瓦各种团队相互组合为你完成你的房子,当然后一种将团队抽象之后也能实现