设计模式之外观设计模式
PS:输入倒逼输出,想持续输出就得持续输入,每天的坚持很小,但是如果坚持一年呢,甚至更长时间呢,结果不一定很美好,但是过程一定很充实。
今天温习一下外设计模式,可以选择阅读同系列文章:
提到外观设计模式,就不得不提到设计模式的六大原则之一的迪米特法则,本篇文章将从如下几个方面介绍外观设计模式:
迪米特法则
如何理解外观设计模式
实现外观设计模式
迪米特法则
开发中经常会遇到类与类之间的关系越来越密切,耦合越来越大,导致当一个类发生变化时也会影响其他类,在设计模式六大原则中迪米特法则就是用来规范这种现象的,那什么是迪米特法则呢?
迪米特法则(Law of Demeter)又叫做最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其他对象保持最少的了解。
迪米特法则还有一个更简单的定义:只与直接的朋友进行通信,解释一下什么是直接的朋友,两个对象之间是耦合关系,我们就说这两个对象之间是朋友关系,耦合的关系有依赖、组合、聚合等,把出现成员变量、方法参数、方法返回值的类称为直接的朋友,而 出现在局部变量中的对象则不是直接朋友,也就是说陌生的类最好不要出现在局部变量中。
如何理解外观设计模式
外观设计模式实际在开发中已经在使用,只是在潜意识里没有外观设计模式这个概念,比如为了方便调用而对一些功能进行封装,最后在一个管理类中统一对外提供,大多数工具类都应该用到了外观设计模式。
归根到底,外观设计模式就是对一些广泛用到的功能进行封装,避免这部分内容频繁的与其他对象产生耦合关系,通过封装统一子系统的复杂性,只对外提供一个入口,以便其他模块调用,这个是外观设计模式的核心。
实现外观设计模式
场景:茶馆中有 A 、B、C 等顾客都需要泡茶喝,而且每个顾客每次泡茶的时候都得经过如下步骤才能泡好茶:
备具
备水
冲泡
每个顾客每次泡茶的时候都与茶具、茶叶、沸水等接触,这明显不符合迪米特法则,可以通过外观设计模式封装泡茶这个流程,也就是茶馆里面的服务员,每次喝茶的时候直接告诉茶馆服务员想喝什么茶就可以了,其他的泡茶细节顾客不需要知道,只要能够喝到想要的茶就对了,下面使用这个案例额简单实现一下外观设计模式。泡茶流程如下:
/**
* 备具
* Created by jzman
* Powered by 2019/5/6.
*/
interface IPrepareTeaSet {
void prepareTeaSet();
}
class PrepareTeaSet implements IPrepareTeaSet {
public void prepareTeaSet() {
System.out.println("备具...");
}
}
/**
* 备水
* Created by jzman
* Powered by 2019/5/6.
*/
interface IPrepareWater {
void prepareWater();
}
class PrepareWater implements IPrepareWater {
public void prepareWater() {
System.out.println("备水...");
}
}
/**
* 冲泡
* Created by jzman
* Powered by 2019/5/6.
*/
interface IBrewMethod {
void brewMethod(String tea);
}
class BrewMethod implements IBrewMethod {
public void brewMethod(String tea) {
System.out.println("冲泡..."+tea);
}
}
对泡茶服务进行统一封装对外提供泡茶服务,如下:
/**
* 茶馆泡茶服务
* Created by jzman
* Powered by 2019/5/6.
*/
class TeaHouse {
// 统一泡茶服务
public static void drinkTea(String tea){
// 备具
new PrepareTeaSet().prepareTeaSet();
// 备水
new PrepareWater().prepareWater();
// 冲泡
new BrewMethod().brewMethod(tea);
}
}
最后顾客想喝什么茶就点什么茶,如下:
/**
* 测试
* Created by jzman
* Powered by 2019/5/6.
*/
class FacadeMain {
public static void main(String[] args) {
// A
TeaHouse.drinkTea("红茶");
// B
TeaHouse.drinkTea("乌龙茶");
}
}
执行日志如下:
备具...
备水...
冲泡...红茶
备具...
备水...
冲泡...乌龙茶
外观设计模式的学习就到此为止,虽然平时的业务开发中也可能这样写,但是在潜意识里面肯定不知道迪米特法则和外观设计模式,通过输入这样的概念,就会在潜意识里面去实践这样的规则,并不断提高自己的编码能力。可在公众号回复关键字【加群】邀你进Android学习交流群。
推荐阅读: