[设计模式] - 外观模式

一、外观模式的简介

1. 外观模式的简介

外观模式(facade pattern) 又叫做门面模式,属于结构性设计模式的一种,它的提出主要是为了隐藏系统的复杂性。=实现了外观模式的系统不需要知道系统内部的复杂联系,这个系统只需要提供一个对外接待的接口即可。

2. 外观模式的使用场景

外观模式通常使用在三种场景下:

  1. 系统重构难度大,这时候可以通过外观模式复用已有代码,隐藏实现细节。
  2. 系统相对独立。
  3. 预防调用者对于接口逻辑不熟悉带来的风险

二、通过业务讲模式

1. 提供一个业务场景

大家对于炒股这个事情应该都不陌生,但是由于害怕成为万千韭菜中的一员,很多人对于炒股都是望而却步,那么为什么普通人觉得自己会成为韭菜呢?主要还是由于股票背后的逻辑非常复杂,我们既需要了解市场的第一时间情报,又要熟悉行业背景,这对于精力有限的很多人来说无疑是听到就会头疼的。所以为了解决这个问题,很多金融公司推出了自己的基金,通过专业的理财经理来提我们这些不懂股票的人来做投资,这样我们只需要选购我们利好的基金就可以达到和投资股票一样的效果,这其实就是一个很典型的门面模式(外观模式)。为了写今天的Demo,我还特意去支付宝投资了一笔巨款买了两只利好的基金:

在这里插入图片描述
那么我们简单的分析一下在支付宝买基金的一个业务流程是怎么样的呢?

2. 业务流程分析

由于博主也是基金投资的小白,所以这个投资流程咱们就简单的概括下,中间可能存在误差但是不影响咱们讲外观模式,勿怪!
在这里插入图片描述

  1. 用户打开支付宝基金页面,挑选基金,最后选择了招商银行和中欧发行的两款基金。
  2. 支付宝接收到用户购买基金的请求,将请求分发到具体的基金机构。
  3. 基金机构完成购买请求处理,返回结果给支付宝
  4. 支付宝将结果反馈给用户

下面我们通过代码来逐步实现

三、外观模式的实现

1. 代码实现

(1) 创建基金产品

基金抽象类

public abstract class Fund {
    
    
	// 开户
	public abstract void openAccount();

	// 认购
	public abstract void subscription();

	// 确认
	public abstract void affrim();

}

招行基金

public class ChinaMerchantsFund extends Fund {
    
    

	@Override
	public void openAccount() {
    
    
		System.out.println("招商银行基金账户开户成功");

	}

	@Override
	public void subscription() {
    
    
		System.out.println("招商银行基金认购成功");

	}

	@Override
	public void affrim() {
    
    
		System.out.println("招商银行基金确认成功");

	}

}

这里为了增加一些差异,我们在中欧基金中增加一个流程就是用户信息评估。
中欧基金

public class CentralEuropeFund extends Fund {
    
    
	@Override
	public void openAccount() {
    
    
		System.out.println("中欧国际基金账户开户成功");

	}

	@Override
	public void subscription() {
    
    
		System.out.println("中欧国际基金认购成功");

	}

	@Override
	public void affrim() {
    
    
		System.out.println("中欧国际基金确认成功");

	}

	public void check() {
    
    
		System.out.println("用户信息校验成功");
	}

}

(2) 创建外观类

public class FundFacade {
    
    

	private ChinaMerchantsFund chinaMerchantsFund;
	private CentralEuropeFund centralEuropeFund;

	public final static String CHINA_MERCHANT = "chinaMerchantsFund";
	public final static String CENTRAL_EUROPE = "centralEuropeFund";

	public void buyFund(String str) {
    
    

		if (CHINA_MERCHANT.equals(str)) {
    
    
			chinaMerchantsFund = new ChinaMerchantsFund();
			chinaMerchantsFund.openAccount();
			chinaMerchantsFund.subscription();
			chinaMerchantsFund.affrim();

		} else if (CENTRAL_EUROPE.equals(str)) {
    
    
			centralEuropeFund = new CentralEuropeFund();
			centralEuropeFund.openAccount();
			centralEuropeFund.check();
			centralEuropeFund.subscription();
			centralEuropeFund.affrim();
		}
	}

}

(3) 测试及测试结果

public class AliPay {
    
    
	public static void main(String[] args) {
    
    
		FundFacade fundFacade = new FundFacade();
		fundFacade.buyFund(FundFacade.CHINA_MERCHANT);
	}
}

测试结果:
在这里插入图片描述
这里我们观察到,一个简单的外观模式实现已经完成了。

2. 实现分析

我们可以将上面的代码简单的分为三个组成部分:

  1. 第一部分就是负责所有细节实现的子系统,子系统可以是一个对象,也可以是一个系统,他们要做的就是处理业务的具体细节。
  2. 第二部分就是负责维护所有子系统的外观类,外观类直到所有子系统的实现细节,对子系统进行统一调度和维护。
  3. 第三部分就是业务调用方,有的人也习惯叫做客户端,客户端要做的事情就是通过调用外观类来实现业务逻辑。

它们之间的关系如下图:
在这里插入图片描述

四、外观模式的特点

1. 外观模式的使用场景

外观类其实在日常的应用非常多,就比如我们在JAVAEE开发中最常用到的三层架构模式就是典型的外观模式设计。当然有些时候我们在做一些工具类的时候,其实也是典型的外观模式应用。

2. 外观模式的优缺点

优点:

  1. 减少了系统之间的相互依赖
  2. 提高了系统灵活性
  3. 提高了系统的安全性

缺点:

  1. 不遵守开闭原则,拓展功能时可能需要修改代码

好了,今天的内容到此结束,如果还有疑问的同学可以私信我或在评论区留言,我会在第一时间为你解答。觉得有收获的小伙伴请记得一键三连,关注博主不要走丢,拒当白嫖党~

猜你喜欢

转载自blog.csdn.net/xiaoai1994/article/details/113103710