侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

JAVA设计模式之外观模式(门面模式)

孔子说JAVA
2019-11-17 / 0 评论 / 0 点赞 / 77 阅读 / 1,894 字 / 正在检测是否收录...

1、外观模式/门面模式(Facade)的定义

外观模式是隐藏了系统的复杂性,能够为子系统中的一组接口提供一个统一的接口。客户在使用系统时不必和子系统打交道了,降低了客户和子系统间的耦合。

2、模式(Facade)优缺点

外观模式是一种结构型模式,其主要优缺点如下。

优点:

  1. 减少客户端关联的类。使客户端关联子系统的类减少,使用子系统更加容易。
  2. 实现客户端和子系统的松耦合。子系统相互独立,变化不会影响到其他子系统和客户端,只需要调整外观类。
  3. 一个子系统的变化不会影响到另一个子系统,子系统内部变化也不会影响到外观对象。

缺点:

  1. 限制客户端访问困难。如果过多限制客户端访问子系统,则会极大减少可变性和灵活性。
  2. 可能修改源码。设计不当,增加子系统会修改外观类源码,违背开闭原则。

3、模式(Facade)适用环境

  1. 为访问一系列复杂子系统提供简单的入口。
  2. 客户端和子系统之间存在很大依赖。
  3. 层次化结构中使用外观模式定义每一层的入口,层与层不直接产生联系,降低耦合度。

4、模式(Facade)的结构

image-1649480178543

外观模式(门面模式)所涉及到的角色有:

  • 门面角色/外观角色(facade) :这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
  • 子系统角色(SubSystem(SystemA、SystemB、SystemC)) :在软件系统中可以有一个或多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用。对于子系统而言,外观类只是另一个客户,它没有任何facade角色的信息和链接。
  • 客户角色(client) :调用facade角色来完成要得到的功能。

5、模式(Facade)的应用实例

SubSystem 子系统角色

public class CPU {   
    public void startup(){  
        System.out.println("cpu startup!");  
    }  
    public void shutdown(){  
        System.out.println("cpu shutdown!");  
    }  
}

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

public class Disk {  
    public void startup(){  
        System.out.println("disk startup!");  
    }  
    public void shutdown(){  
        System.out.println("disk shutdown!");  
    }  
}

Facade 外观角色

public class Computer {  
    private CPU cpu;  
    private Memory memory;  
    private Disk disk;  

    public Computer(){  
        cpu = new CPU();  
        memory = new Memory();  
        disk = new Disk();  
    }  

    public void startup(){  
        System.out.println("start the computer!");  
        cpu.startup();  
        memory.startup();  
        disk.startup();  
        System.out.println("start computer finished!");  
    }  

    public void shutdown(){  
        System.out.println("begin to close the computer!");  
        cpu.shutdown();  
        memory.shutdown();  
        disk.shutdown();  
        System.out.println("computer closed!");  
    }  
}

客户端角色

Computer computer = new Computer();  
computer.startup();  
computer.shutdown();

6、模式(Facade)的延伸

在上面的例子中,我们定义的门面是一个具体的类,但是当需要增加新的功能的时候,就需要修改门面类了,所以最好的办法是做成抽象门面,也就是将门面类的功能抽象出来,然后有不同的需求的时候,可以做两个具体的门面类。

0

评论区