外观模式方法介绍

概述

  外观模式是一个比较简单的设计模式,我们在日常的开发过程中,经常用用到它。它的本质思想就是封装交互,简化调用,它是最小知道原则的很好的体现方式,如果一个系统里面包含了很多的子系统,外部需要调用这个子系统里面的模块,如果没有外观模式的加入,外部调用系统就需要自己去单独调用内部的各个模块,这个时候,内部的情况就会暴露给外部,给系统的可扩展性造成了影响。在这种情况下,我们给内部系统做一个封装,增加一个外部系统统一调用的外观类,这会让外部系统很容易调用,因为仅仅暴露给了外部一个外观类,如果需要修改,只需要保证外观的调用方式一致即可,大大增强了内部系统的扩展性。
  外观模式又以下几个优点:

  • 松散耦合
  • 简单易用
  • 更好的划分访问层次

外观模式的uml图

外观模式

模式代码示例

  1. 我们分别创建三个系统的api和对应的实现类
public interface ModelAApi {
    void operationA();
}
public class ModelAImpl implements ModelAApi{
    @Override
    public void operationA() {
        System.out.println("operate model A");
    }
}
public interface ModelBApi {
    void operationB();
}
public class ModelBImpl implements ModelBApi{
    @Override
    public void operationB() {
        System.out.println("operate model B");
    }
}
public interface ModelCApi {
    void operationC();
}
public class ModelCImpl implements ModelCApi{
    @Override
    public void operationC() {
        System.out.println("operate model C");
    }
}
  1. 创建外观类,并封装调用方法
public class Facade {
    private ModelAApi modelA;

    private ModelBApi modelB;

    private ModelCApi modelC;

    public Facade() {
        this.modelA = new ModelAImpl();
        this.modelB = new ModelBImpl();
        this.modelC = new ModelCImpl();
    }

    public void operationAll() {
        this.modelA.operationA();
        this.modelB.operationB();
        this.modelB.operationB();
    }

    public void operationA() {
        this.modelA.operationA();
    }

    public void operationB() {
        this.modelB.operationB();
    }

    public void operationC() {
        this.modelC.operationC();
    }
}
  1. 测试客户端类
public class Client {

    private Facade facade;

    @Before
    public void before() {
        this.facade = new Facade();
    }

    @Test
    public void testOperationAll() {
        System.out.println("----------------------testOperationAll--------------------");
        facade.operationAll();
    }

    @Test
    public void testOperationA() {
        System.out.println("----------------------testOperationA--------------------");
        facade.operationA();
    }

    @Test
    public void testOperationB() {
        System.out.println("----------------------testOperationB--------------------");
        facade.operationB();
    }

    @Test
    public void testOperationC() {
        System.out.println("----------------------testOperationC--------------------");
        facade.operationC();
    }

}
  1. 测试结果
----------------------testOperationA--------------------
operate model A
----------------------testOperationB--------------------
operate model B
----------------------testOperationC--------------------
operate model C
----------------------testOperationAll--------------------
operate model A
operate model B
operate model B

后记
  个人总结,欢迎转载、评论、批评指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值