当前位置: 首页 > news >正文

【设计模式】模板方法模式和门面模式

模板方法模式和门面模式

  • 模板方法模式
    • 代码示例
  • 门面模式
    • 代码示例
    • 门面模式的应用场景

模板方法模式

模板方法模式非常简单,就是定义了一个固定的公共流程,整个流程有哪些步骤是事先定义好的,具体的步骤则交由子类去实现。属于行为型设计模式。
简单来说就是将公共的行为抽取出来放到父类中实现,不同的行为则交给子类自己实现

代码示例

模板模式十分简单,我们用其实现一个去银行办理业务的例子,无论你去银行办理什么业务,都需要经过: 取号,排队,办理业务几个步骤 ,这里还增加了一个钩子方法,对于某些特殊的情形,可以增加额外的处理步骤

public abstract class AbstractBank {public void doBiz() {if(!isVip()) {getNum();waitForCall();}doBusiness();}protected abstract boolean isVip();public abstract void doBusiness();private void waitForCall() {System.out.println("排队中,等待叫号...");}private void getNum() {System.out.println("取号,准备排队...");}}
public class CrashBusiness extends AbstractBank{@Overrideprotected boolean isVip() {return false;}@Overridepublic void doBusiness() {System.out.println("办理现金业务...");}
}
public class DebitBusiness extends AbstractBank{@Overrideprotected boolean isVip() {return true;}@Overridepublic void doBusiness() {System.out.println("办理贷款业务.....");}
}
public class Test {public static void main(String[] args) {CrashBusiness crashBusiness = new CrashBusiness();crashBusiness.doBiz();new DebitBusiness().doBiz();}
}

门面模式

门⾯模式,也叫外观模式,英⽂全称是 Facade Design Pattern。
在 GoF 的《设计模式》⼀书中,门⾯模式是这样定义的:

Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.

门⾯模式为⼦系统提供⼀组统⼀的接⼝,定义⼀组⾼层接⼝让⼦系统更易⽤。属于结构型模式。

经典的例子就是app和服务端的交互,app有一个复杂模块,需要从三个系统获取对应的数据来组装,如果app之间和三个系统交互,就要进行三次网络传输,增加一个中间层,将三个系统的接口进行整合封装,对外提供一个接口给app调用,那么就能明显提高性能

代码示例

我们需要根据用户的账号获取其订单信息, 那么我们先需要根据用户账号判断其是否已登录,已登录的用户才可以 根据其账号获取到对应的id,然后再获取id对应的订单信息


public class LoginService {public boolean isLogin(String account) {return true;}
}public class GetUserInfo {public int getUserId(String account) {System.out.println("根据用户名称获取用户id");return 1;}
}
public class GetUserOrderList {public List<String> getOrderList(Integer id) {System.out.println("根据用户id找出其订单");return new ArrayList<>();}
}
public class OrderService {GetUserInfo userInfo = new GetUserInfo();GetUserOrderList userOrderList = new GetUserOrderList();LoginService loginService = new LoginService();public List<String> getOrderByUser(String account) throws Exception {if (loginService.isLogin(account)) {Integer id = userInfo.getUserId(account);return userOrderList.getOrderList(id);}throw new Exception("not login");}
}
public class Test {public static void main(String[] args) throws Exception {OrderService service = new OrderService();service.getOrderByUser("xiaoming");}
}

门面模式的应用场景

  1. 解决易⽤性问题

门⾯模式可以⽤来封装系统的底层实现,隐藏系统的复杂性,提供⼀组更加简单易⽤、更⾼层的接⼝。⽐如,Linux 系统的调⽤函数就可以看作⼀种“门⾯”。它是 Linux 操作系统暴露给开发者的⼀组“特殊”的编程接⼝,它封装了底层更基础的 Linux 内核调⽤。
从隐藏实现复杂性,提供更易⽤接⼝这个意图来看,门⾯模式有点类似之前讲到的迪⽶特法则(最少知道原则)和接⼝隔离原则:两个有交互的系统,只暴露有限的必要的接⼝。
除此之外,门⾯模式还有点类似之前提到封装、抽象的设计思想,提供更抽象的接⼝,封装底层实现细节。

  1. 解决性能问题
    通过将多个接⼝调⽤替换为⼀个门⾯接⼝调⽤,减少⽹络通信成本,提⾼ App 客户端的响应速度。
http://www.lryc.cn/news/37091.html

相关文章:

  • Kubernetes未来十年的四大发展趋势
  • 一、sql 基础知识、函数和子查询
  • 产品射频认证笔记
  • 做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)
  • 【Flutter从入门到入坑】Flutter 知识体系
  • 顺序表的基本操作
  • 设计模式——创建型模型——单列模式(8种实现)
  • 【软考中级】软件设计师笔记
  • 包教包会的ES6
  • python学习——【第四弹】
  • Web3中文|无聊猿Otherside元宇宙启动第二次旅行
  • SpringCloud-7_OpenFeign服务调用
  • 解决docker容器之间网络互通
  • 测试微服务:快速入门指南
  • MySQL Show Profile分析
  • 基于Docker快速搭建蜜罐Dionaea(30)
  • WP_Query 的所有参数及其讲解和实用案例
  • 100个网络运维工作者必须知道的小知识!(上)
  • Python如何获取大量电影影评,做可视化演示
  • 【C语言】详讲qsort库函数
  • SEO技术风口来了|SEO能否抓住全球约93%的网络用户?
  • mxnet版本与numpy,requests等都不兼容问题
  • 逆向分析——壳
  • 为 Argo CD 应用程序指定多个来源
  • verilog specify语法
  • CMake编译学习笔记
  • Day913.反向代理和网关是什么关系 -SpringBoot与K8s云原生微服务实践
  • IT行业就业趋势显示:二季度平均月薪超8千
  • 【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
  • C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator