码迷,mamicode.com
首页 > 其他好文 > 详细

外观模式(Facade Pattern)

时间:2017-12-18 18:50:47      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:put   margin   应用   图片   耦合度   computer   gpo   直接   外观模式   

定义:
 
定义了一个高层、统一的接口,外部与通过这个统一的接口对子系统中的一群接口进行访问。
 
解决的问题:
 
  • 避免了系统与系统之间的高耦合度
  • 使得复杂的子系统用法变得简单

 

uml类图:

技术分享图片

 

 
模式组成:
  • Facade:外观角色。是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组成
  • Subsystem classes:子系统角色。实现子系统的功能,并处理由Facade对象指派的任务。对子系统而言,facade和client角色是未知的,没有Facade的任何相关信息;即没有指向Facade的实例
  • client:客户角色。调用facade角色获得完成相应的功能
 
优点:
 
  • 降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
    1. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
    2. 减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系,松耦合使得子系统的组件变化不会影响到它的客户。
  • 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单
    1. 引入外观角色之后,用户只需要与外观角色交互;
    2. 用户与子系统之间的复杂逻辑关系由外观角色来实现
  • 降低原有系统的复杂度和系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
 
 
缺点:
 
  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
  • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
 
应用:
 
举个栗子:
 
定义外观角色
class Computer {
    Memory memory;
    Cpu cpu;

    public Computer() {
        memory = new Memory();
        cpu = new Cpu();
    }

    public void start() {
        memory.start();
        cpu.start();
    }
}

定义子系统角色

class Memory {
    public void start() {
        System.out.println("memory start!");
    }
}

 

定义子系统角色

class Cpu {
    public void start() {
        System.out.println("cpu start!");
    }
}

客户端调用

 public static void main(String[] args) {         
             Computer c = new Computer();         
             c.start();    
        }

 

 

 

 

 

 

 

外观模式(Facade Pattern)

标签:put   margin   应用   图片   耦合度   computer   gpo   直接   外观模式   

原文地址:http://www.cnblogs.com/amei0/p/8057589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!