设计模式-模板方法设计模式
时间:2019-09-19
本文章向大家介绍设计模式-模板方法设计模式,主要包括设计模式-模板方法设计模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
面向对象,万物皆对象,用一个雷来反应现实生活中的东西。
比如银行系统,业务升级---活期/定期,差别很小,就加判断(违背单一职责)。差别比较多,尤其是类比较复杂,类型拆分下。拆分之后,自然就有父类,代码重用。
利率:每个客户端都有利率,但是各不一样-----抽象方法。
Show():不分客户端是一样的,个别客户端是不一样的------虚方法。
有个复杂的多步骤的业务,定义一个父类(模板),模板负责完成流程,把步骤分解,固定不变的当前类(父类)----各不相同的子类,有的相同,有的不同的,用虚方法。
好处:可以扩展,职责分明。
/// <summary> /// 银行客户端 /// </summary> public abstract class AbstractClient { public void Query(int id, string name, string password) { if (this.CheckUser(id, password)) { double balance = this.QueryBalance(id); double interest = this.CalculateInterest(balance); this.Show(name, balance, interest); } else { Console.WriteLine("账户密码错误"); } } public bool CheckUser(int id, string password) { return DateTime.Now < DateTime.Now.AddDays(1); } public double QueryBalance(int id) { return new Random().Next(10000, 1000000); } /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public abstract double CalculateInterest(double balance); public virtual void Show(string name, double balance, double interest) { Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}", name, balance, interest); } //private void Show(string name, double balance, double interest) //{ // Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}", // name, balance, interest); //} }
/// <summary> /// 银行客户端 /// </summary> public class Client { public void Query(int id, string name, string password) { if (this.CheckUser(id, password)) { double balance = this.QueryBalance(id); double interest = this.CalculateInterest(balance); this.Show(name, balance, interest); } else { Console.WriteLine("账户密码错误"); } } public bool CheckUser(int id, string password) { if (true) { } else { } return DateTime.Now < DateTime.Now.AddDays(1); } public double QueryBalance(int id) { if (true) { } else { } return new Random().Next(10000, 1000000); } public double CalculateInterest(double balance) { if (true) { } else { } return balance * 0.005; } public void Show(string name, double balance, double interest) { Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}", name, balance, interest); } }
/// <summary> /// 银行客户端 /// </summary> public class ClientCurrent : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.001; } }
/// <summary> /// 银行客户端 /// </summary> public class ClientRegular : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.003; } }
/// <summary> /// 银行客户端 /// </summary> public class ClientVip : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.005; } public override void Show(string name, double balance, double interest) { Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}", name, balance, interest); } }
{ AbstractClient client = new ClientCurrent(); client.Query(387, "冰乐", "123456"); } { AbstractClient client = new ClientRegular(); client.Query(448, "冰乐", "000000"); } { AbstractClient client = new ClientVip(); client.Query(259, "冰乐", "251146"); }
模板方法设计模式,好像就只是抽象类+子类。
原文地址:https://www.cnblogs.com/taotaozhuanyong/p/11552305.html
- BZOJ1101: [POI2007]Zap(莫比乌斯反演)
- freeRTOS事件组学习
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
- JVM活学活用——优化springboot
- .Net中的AOP读书笔记系列之AOP介绍
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
- .Net中的AOP系列之构建一个汽车租赁应用(上)
- Modbus RTU驱动程序开发指引
- freeRTOS任务创建
- 洛谷P4213 Sum(杜教筛)
- JVM活学活用——调优工具
- .Net中的AOP系列之构建一个汽车租赁应用(下)
- Zookeeper学习笔记——2 Shell和Java API的使用
- Java基础巩固——反射
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shell 命名管道,进程间通信, ncat作http server
- Linux atop监控
- go modules中使用replace用法
- 分布式文件系统Ceph的挂载方式
- 在CentOS 7上挂载CephFS
- Qt音视频开发14-mpv读取和控制
- 深入理解Nginx的rewrite模块
- max os 安装各种问题/Error解决方法
- 不要启用 net.ipv4.tcp_tw_recycle
- 利用SSH(无密码)免登录来节省你的生命
- 深入linux下磁盘Disk,分区Partition,挂载Mount
- 净化Git之rebase变基的使用
- Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
- Bash:选择结构之case
- ElasticSearch的Reindex