设计模式-08-适配器模式-[门面模式/外观模式]

1. [门面模式/外观模式] 是 [对象的适配器模式] 的衍生模式

2.[门面模式/外观模式] 简介

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

        简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只关心结果即可。这个场景其实在日常开发中使用的频率还是非常高的;

      

3.案例分析

          假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。关闭也是如此。但是实际上我们在电脑开/关机时根本不需要去操作这些组件,因为电脑已经帮我们都处理好了,并隐藏了这些东西。这些组件好比子系统角色,而电脑就是一个外观角色。代码如下:

CPU:

public class A1_CPU {

    public void startUp(){
        System.out.println("CPU 已经启动就绪");
    }

    public void shutDown(){
        System.out.println("CPU 已经停止运行");
    }
}

内存:

public class A2_Memory {

    public void startUp(){
        System.out.println("内存 已经启动就绪");
    }

    public void shutDown(){
        System.out.println("内存 已经停止运行");
    }
}

硬盘:

public class A3_Disk {

    public void startUp(){
        System.out.println("硬盘 已经启动就绪");
    }

    public void shutDown(){
        System.out.println("硬盘 已经停止运行");
    }
}

门面-电脑: 

public class B1_Computer {

    private A1_CPU cpu;
    private A2_Memory memory;
    private A3_Disk disk;

    public B1_Computer(){
        this.cpu = new A1_CPU();
        this.memory = new A2_Memory();
        this.disk = new A3_Disk();
    }

    public void startUp(){
        this.cpu.startUp();
        this.memory.startUp();
        this.disk.startUp();
        System.out.println("....电脑启动....");
    }

    public void shutDown(){
        this.cpu.shutDown();
        this.memory.shutDown();
        this.disk.shutDown();
        System.out.println("....电脑停止....");
    }
}

客户端调用:

public class C1_Client {

    public static void main(String[] args) {
        B1_Computer computer = new B1_Computer();
        computer.startUp();
        System.out.println("==============");
        computer.shutDown();
    }
}

客户端调用结果:

CUP 已经启动就绪
内存 已经启动就绪
硬盘 已经启动就绪
....电脑启动....
==============
CUP 已经停止运行
内存 已经停止运行
硬盘 已经停止运行
....电脑停止....

4.外观模式的角色

  • 门面角色(facade):这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
  • 子系统角色(SystemA、SystemB、SystemC):实现了子系统的功能。对子系统角色来说,facade角色与客户角色一样,是未知的,它没有任何facade角色的信息和链接。
  • 客户角色(client):调用facade角色来完成要得到的功能。

5.外观模式的优点

  • 对客户端屏蔽了子系统组件,减少了客户端处理的对象数量,也减少了客户端的代码量。
  • 实现了客户端和子系统的松散耦合,使得子系统个变化不会影响到调用它的客户端,只需要改变外观类即可。
  • 一个子系统的变化不会影响到另一个子系统,子系统内部变化也不会影响到外观对象。

6.外观模式的缺点

  • 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性
  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值