设计模式(九)外观模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

外观模式又叫门面模式,在java中应用十分广泛,比如web开发中前端和后端的交互就是外观模式,前端只需要知道使用这个接口会产生什么样的结果,比如调用insertUser,会在数据库中插入一条数据,但是后台是怎么做的,前端完全不需要管,也不需要去管。

例子

LZ觉得电脑这个例子来讲外观模式是非常好的,电脑内部非常复杂,假如没有外观类,那么和用户类的耦合度降非常高,拿用户打开电脑和关闭电脑为例,假如没有外观模式的话,用户直接面对的是CPU,内存和硬盘,各种复杂的操作和逻辑,假如真的如此的话,那么会使用的电脑的人将变得很少,很少有人会有这么专业的知识。
但是当我们使用了外观模式后,用户只需要按一个按钮,开机键,关机只需要点一下关机的按钮就可以了。这让用户与大量复杂的东西解耦开了,对于用户来说,他不用关心按了开机键后到底发生了什么,然后他确实也不需要关心,他只知道按了开机键后,电脑打开了,这就足够了。
用java来实现如下:


/***
 *
 *@Author ChenjunWang
 *@Description:Cpu类
 *@Date: Created in 17:19 2018/3/26
 *@Modified By:
 *
 */
public class Cpu {

    public void execute() {
        System.out.println("CPU 开始执行");
    }

    public void colse(){
        System.out.println("断开CPU电源");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:磁盘类
 *@Date: Created in 17:19 2018/3/26
 *@Modified By:
 *
 */
public class Disk {
    public void read() {
        System.out.println("磁盘开始读取数据……");
    }
    public void write() {
        System.out.println("磁盘开始写入数据……");
    }
    public void colse(){
        System.out.println("断开磁盘电源");
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:内存类
 *@Date: Created in 17:20 2018/3/26
 *@Modified By:
 *
 */
public class Memory {
    public void write() {
        System.out.println("写入内存……");
    }
    public void read() {
        System.out.println("读取内存……");
    }
    public void colse(){
        System.out.println("断开内存电源");
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:电脑外观类(封装操作)
 *@Date: Created in 23:57 2018/3/25
 *@Modified By:
 *
 */
public class ComputerFacade {
    private Cpu cpu;
    private Disk disk;
    private Memory memory;
    public ComputerFacade(){
        this.cpu = new Cpu();
        this.disk = new Disk();
        this.memory = new Memory();
    }
    //开机方法,开机的一系列流程都在这个方法体里,最终电脑开机完成
    public void startComputer(){
        cpu.execute();
        disk.read();
        memory.write();
        System.out.println("一堆复杂操作…………");
        System.out.println("启动完成!");

    }
    //关机方法,关机的一系列流程都在这个方法体里,最终电脑关机完成
    public void closeComputer(){
        System.out.println("一堆复杂操作…………");
        disk.colse();
        memory.colse();
        cpu.colse();
        System.out.println("关闭完成!");

    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:用户类
 *@Date: Created in 17:31 2018/3/26
 *@Modified By:
 *
 */
public class User {
    public static void main(String[] args) {
        ComputerFacade computerFacade = new ComputerFacade();


        System.out.println("----------------开机----------------");
        computerFacade.startComputer();
        System.out.println("----------------关机----------------");
        computerFacade.closeComputer();
    }
}

运行结果如下
--------------------------------------------
----------------开机----------------
CPU 开始执行
磁盘开始读取数据……
写入内存……
一堆复杂操作…………
启动完成!
----------------关机----------------
一堆复杂操作…………
断开磁盘电源
断开内存电源
断开CPU电源
关闭完成!

本例UML图
facade

当使用了外观模式后,对象间的耦合度大大降低,大大方便了使用者使用功能,用户不需要再和复杂的硬件打交道啦!

总结

优点

(1)最重要的有点是,降低了用户类与电脑类的耦合度,实现松耦合关系
(2)减少了用户处理的对象数目,并使子系统的使用更加简单。
(3)用户与子系统之间的复杂逻辑关系由外观角色来实现

缺点

(1)在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
(2)不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/facade

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章