java23中设计模式(1)-facade(门面,外观)模式

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.前一种的方案提供了更多的可定制的可能,你可以找到黑曜石,青砖,灰瓦各种团队相互组合为你完成你的房子,当然后一种将团队抽象之后也能实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值