颜值10分姐姐带我玩转java设计模式(内附照片)- 门面模式

先不说话,直接来张姐姐照片,称呼包子姐姐即可,希望包子姐姐能带飞。

原创不易,麻烦先三连,再细看,谢谢

示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/igdnss/java_facade.git

设计模式共有23种,可以分为三大类:创建型模式,结构型模式,行为型模式。学好这三大类,基本可以闯荡整个武林了。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、门面(外观)模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

本篇就有请包子姐姐带我们一起见识一下结构型模式中的门面模式。

前言

我:包子姐姐,最近一直在看公司的项目,发现有好多地方都有Facade字样,点进去看发现向外提拱的接口好简单,但追到业务层发现还是很复杂。
包子姐姐:不错哦,你看代码一眼就能命中要害。其实你看的代码就是用门面模式将业务逻辑进行了再次封装,使得调用者无须关心其内在的业务实现。
我:咦,原来是这样啊,那烦请姐姐给我们介绍一下这个设计模式。
包子姐姐:当然没问题,姐姐我不仅人长得漂亮,还特别喜欢答读者问。
我:一点不假,我们都认可姐姐的颜值,尤其那个游戏号为黄色教科书的,天天嘴里都挂着姐姐。
包子姐姐:哈哈,那个老色批,不提他了。 在我看来看,门面模式是23种设计模式中最简单的一种设计模式。写代码写个五六年,开始重构代码时建议大家尝试用设计模式来重构,但切记不要强制使用设计模式, 合适的场景下能用则用,这样才能提高自己的编程水平。门面模式就是我重构代码时第一个使用的设计模式。

定义

我:姐姐,那门面模式是如何定义的?
包子姐姐:门面模式隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口,此接口包装了实现系统业务逻辑的若干个接口,算是一个总接口。
我:有点感觉了,那它属于哪一类呢?
包子姐姐:门面模式是将多个接口进行了组合,使得代码的可读性更强,因此它属于结构型设计模式。
我:懂了懂了,姐姐可不可以举一个生活中的例子让门面模式更通俗化。
包子姐姐:哈,这个生活中的例子太多了,例如“黄色教务科书”这个老色批需要去医院做某方面切除手术时,他不需要知道整个流程的细节,他所要做的就是往那一躺,腿张开,后面交给医生处理就行了。可以看下图:

在这里插入图片描述

我:姐姐,你对老色批好了解哦。
包子姐姐:哈哈,全世界人都知道,这是他的“特长”,他引以为傲呢。老色批不管其他的,只需要做一个手术就行,后面的细节完全可以不管,也就是说“做手术”这个动作将所有的流程都包装起来了,对外也就只有一个“做手术”的动作。
我:这个例子精典,想必大家一看就能懂。
包子姐姐:下面用代码来实现一下。为了体现门面模式优势,假如老色批有个弟弟,也去做切除手术,但是呢这个人比较傻,什么事都要自己去弄,最终花了好大的精力才切除成功。

示例1:老色批弟弟做手术,非门面模式

public class Anaesthetist {
	public void anaesthesia() {
		System.out.println("打麻药 ... ");
	}
}
public class Disinfector {
	public void disinfect(){
		System.out.println("消毒 ... ");
	}
}
public class Cutter {
	public void cut() {
		System.out.println("切除 ... ");
	}
}
public class Wrapper {
	public void wrap() {
		System.out.println("包括 ... ");
	}
}
public class Brother {
	public static void main(String[] args) {
	//代码可读性差
		Disinfector disinfector = new Disinfector();
		Anaesthetist anaesthetist = new Anaesthetist();
		Cutter cutter = new Cutter();
		Wrapper wrapper = new Wrapper();
		disinfector.disinfect();
		anaesthetist.anaesthesia();
		cutter.cut();
		wrapper.wrap();
	}
}

包子姐姐:好傻的弟弟。老色批吸取了弟弟的教训,他去做手术的时候比较顺利

示例2:老色批做手术,门面模式

public class MainDoctor {
	Disinfector disinfector = new Disinfector();
	Anaesthetist anaesthetist = new Anaesthetist();
	Cutter cutter = new Cutter();
	Wrapper wrapper = new Wrapper();

	public void operation() {
		disinfector.disinfect();
		anaesthetist.anaesthesia();
		cutter.cut();
		wrapper.wrap();
	}
}
public class SeHimself {

	public static void main(String[] args) {
	//代码可能性高
		MainDoctor mainDoctor = new MainDoctor();
		mainDoctor.operation();
	}

}

包子姐姐:很简单吧,就加了一层包装类,就让代码的可读性瞬间提高,并且调用者使用起来也方便。没错,这就是门面模式,是不是超级简单。
我:哇,真的很简单,老色批得救了。那门面模式有没有什么缺点呢?
包子姐姐:当然有啊,就拿老色批和他弟弟的例子来说吧,老色批的方式明显多了一个业务类,这里代码简单,如果代码复杂的话可能要多很多业务类,但是没关系,这个弊明显小于利,所以don’t care about it .
我: 我在工作中一定要用上,对了,包子姐姐,在什么场景上适合使用门面模式?

使用场景

包子姐姐: 简单来说,门面模式就是把一些复杂的流程封装成一个接口提供给外界使用,使得用户能更简单的调用接口,此模式中包括三个角色:门面角色:外观模式的核心(上文中的MainDoctor),它需要被Client调用,它需要熟悉子系统的功能;子系统角色:实现子系统的功能,它对客户角色是未知的,上文中的Disinfector,Anaesthetist ,Cutter ,Wrapper ;客户角色:通过调用Facade来完成要实现的功能,上文中的SeHimself 。
我:欧克匹克,明白了,以后重构代码时,脑海中想着老色批去做切除手术,然后代码质量就嗖的一下上去了。

结束语

包子姐姐:好了,关于门面模式就介绍完了,很简单,很实用。希望本文能帮助大家,包子姐姐在此祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!
我:感谢包子姐的细心讲解,很精彩,期待下一个设计模式,也祝包子姐姐越长越漂亮。

评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浦江之猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值