当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 设计模式-外观模式模式

设计模式-外观模式模式

2019年05月27日  | 移动技术网IT编程  | 我要评论
外观模式(结构型模式) 定义 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[DP] 外观模式简单点说,就是通过外观类把所有的子系统类进行组合,供外部调用。 这样既不暴露内部,也降低了耦合。对照下面这张图能很好的理解外 ...

外观模式(结构型模式)

  • 定义

外观模式(facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[dp]

 

外观模式简单点说,就是通过外观类把所有的子系统类进行组合,供外部调用。

这样既不暴露内部,也降低了耦合。对照下面这张图能很好的理解外观模式(mvc三层架构就使用到了外观模式)

 


 

 

  • 特点
  1. 子系统不被直接调用
  2. 外观类去组合所有的子系统类实现,供外部使用。
  3. 外观类需要知道所有子系统

 

 

  • 结构

client:外部调用类,客户端类

facade:外观类

subsystem classes:子系统类


 

 

  • 代码

例子:启动电脑时,会启动cpu、硬盘、显卡。现在电脑类作为外观类,cpu、硬盘、显卡类作为子系统类,使用电脑的人作为客户端。客户端只允许电脑开机和电脑关机,cpu、硬盘、显卡的启动和停止交给电脑类(外观类)。

      子系统类集

/**
 * @ author     :fonxi
 * @ date       :2019/5/24 12:38
 * @ description:cpu
 */
public class cpu {
    public void start(){
        system.out.println("cpu开始运行");
    }

    public void stop(){
        system.out.println("cpu停止运行");
    }
}

  

/**
 * @ author     :fonxi
 * @ date       :2019/5/24 12:45
 * @ description:硬盘
 */
public class harddisk {
    public void start(){
        system.out.println("硬盘开始运行");
    }

    public void stop(){
        system.out.println("硬盘停止运行");
    }
}

  

/**
 * @ author     :fonxi
 * @ date       :2019/5/24 12:45
 * @ description:显卡
 */
public class graphicscard {
    public void start(){
        system.out.println("显卡开始运行");
    }

    public void stop(){
        system.out.println("显卡停止运行");
    }
}

  外观类

/**
 * @ author     :fonxi
 * @ date       :2019/5/24 12:34
 * @ description:外观类 电脑类
 */
public class facade {

    private cpu cpu;
    private graphicscard graphicscard;
    private harddisk harddisk;

    public facade(){
        cpu = new cpu();
        graphicscard = new graphicscard();
        harddisk = new harddisk();
    }

    //电脑开机
    public void startingup(){
        cpu.start();
        graphicscard.start();
        harddisk.start();
    }

    //电脑关机
    public void shutdown(){
        cpu.stop();
        graphicscard.stop();
        harddisk.stop();
    }
}

  客户端调用类

/**
 * @ author     :fonxi
 * @ date       :2019/5/24 12:33
 * @ description:客户端调用类
 */
public class testcontroller {
    public void print(){
        facade facade = new facade();
        system.out.println("开机");
        facade.startingup();
        system.out.println("关机");
        facade.shutdown();
    }
}

  输出结果

开机
cpu开始运行
显卡开始运行
硬盘开始运行
关机
cpu停止运行
显卡停止运行
硬盘停止运行

 很明显,客户端只进行了开关机,而子系统集的cpu、硬盘、显卡的启动和停止都是由外观类来完成的。


 

 

  • 使用场景
  1. 当子系统类需要很高的安全性,需要隐藏,不被其他人访问时。
  2. 当子系统类外部使用起来特别复杂时

 

 

  • 优缺点

优点:

  1. 内部隐藏,安全
  2. 内外部不直接访问,降低了耦合度
  3. 减少依赖,提高了灵活度

缺点:

  1. 违反开闭原则,外观类耦合,修改时麻烦
  2. 增加外观类,系统复杂性提升

 

 

  • 总结

外观模式减少外部与内部的交互,使系统松散耦合,外部调用简便。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网