设计模式 - 外观模式(门面模式)

外观模式(门面模式)是一种结构型设计模式,用于减少客户端与复杂系统间的交互。通过提供一个高层次接口,外部与内部通信只能通过内部设定的单一窗口。文中以组装电脑为例,展示了如何通过电脑门店(外观)简化装机过程,降低了对外部的复杂性。模式的应用能提高灵活性和安全性,但修改时需调整门面角色代码,不符合开闭原则。
摘要由CSDN通过智能技术生成

外观模式:又叫“门面模式”属于结构型设计模式,是比较简单,常见的,使用比较广泛的设计模式之一。主要的目的是通过提供对现有系统中方法的委托调用来简化客户端的请求

定义

外部想要跟内部通信,必须通过一个由内部提供的高层次接口的对象进行。换成大白话就是说,外面的要跟内部的交流,只能通过内部提供的唯一一个通信窗口。其目的就是隐藏系统的复杂性,简化客户端和系统交互的接口。

例子

又到了举栗子的时间了。现代社会,大家都过着快节奏的生活,生活质量也逐步提高了,很多时候需要一些特别的东西来满足一下自己。这时就出现了一种业务私人订制
例如现在你要新装配一台电脑主机,这天你去逛逛电脑城
上码:

普通写法

如果是自己去组装(没有用模式的方式)

/**
 * 组装一台电脑主机的步骤
 */
public interface IBuildUp {
    public void getCpu();
    public void getMotherBoard();
    public void getMemory();
    public void getPower();
    public void getStorage();
    public void getFans();
    public void getChassis();
    public void build();
}

public class BuildUpImpl implements IBuildUp{
    @Override
    public void getCpu() {
        System.out.println("拿了一块CPU");
    }

    @Override
    public void getMotherBoard() {
        System.out.println("拿了一块主板");
    }

    @Override
    public void getMemory() {
        System.out.println("拿了两条8G内存");
    }

    @Override
    public void getPower() {
        System.out.println("拿了一个电源");
    }

    @Override
    public void getStorage() {
        System.out.println("拿了一块固态硬盘");
    }

    @Override
    public void getFans() {
        System.out.println("拿了些散热器");
    }

    @Override
    public void getChassis() {
        System.out.println("拿了一个机箱");
    }

    @Override
    public void build() {
        System.out.println("把硬件组装起来并装上系统 => 电脑主机");
    }
}

public class Client {
    public static void main(String[] args) {
        IBuildUp computer = new BuildUpImpl();
        computer.getCpu();
        computer.getMemory();
        computer.getMotherBoard();
        computer.getPower();
        computer.getStorage();
        computer.getFans();
        computer.getChassis();
        computer.build();
    }
}

运行结果:
在这里插入图片描述

外观模式版本

但是,这样干一天,才搞出你要的主机,不累吗?过程中还可能各种翻车。不过幸好电脑城不是有各种门店吗?不是有人可以帮你装机的吗?你就把事交给他们不就完了吗?你只需要跟他说,你要装一台电脑主机,他不就会给你搞好了吗?是吧!继续上码:
这时需要一家电脑店

/**
 * 电脑门店
 */
public class Store {
    IBuildUp computer = new BuildUpImpl();

    public Store() {
        System.out.println("电脑门店");
    }

    /**
     * 装机服务
     */
    public void getComputer(){
        computer.getCpu();
        computer.getMemory();
        computer.getMotherBoard();
        computer.getPower();
        computer.getStorage();
        computer.getFans();
        computer.getChassis();
        computer.build();
    }
}

而你,只需要在这个门店使用他们的装机服务就可以得到一台你要的电脑主机了

public class Client {
    public static void main(String[] args) {
        Store store = new Store();
        store.getComputer();
    }
}

运行结果:
在这里插入图片描述
其中 Store就是关键,他就是外部和内部交流的接口。它把内部复杂的操作,对各个子系统的数据获取都处理了,只留给外部一个访问接口,简化了访问方式。外部只需要跟它交流,就能间接完成很多复杂的操作。

另外,如果是商家心情大好,送了你一些LED灯带,只需要在Store里修改即可,调用的地方并不需要改变

public class LED {

    public void setLED(IBuildUp build){
        System.out.println("给主机加装LED灯带");
    }
}

/**
 * 电脑门店
 */
public class Store {
    IBuildUp computer = new BuildUpImpl();
    LED led = new LED();
    public Store() {
        System.out.println("电脑门店");
    }

    /**
     * 装机服务
     */
    public void getComputer(){
        computer.getCpu();
        computer.getMemory();
        computer.getMotherBoard();
        computer.getPower();
        computer.getStorage();
        computer.getFans();
        computer.getChassis();
        led.setLED(computer);
        computer.build();
    }
}

运行结果:
在这里插入图片描述

优缺点

  • 优点 : 解耦,减少了系统的互相依赖,提高了灵活性和安全性
  • 缺点:不符合开闭原则,遇到有需要修改的时候只能去修改门面角色的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值