编程源自生活:抽象 -> 生活中的洗头问题
设计背景:
我:头上的油揩给了手,手接触洗手液。洗手液伤头皮,这样头皮就不会和洗手液接触了。
具体执行过程描述: 1.手揩油 -> 2.取液体 3.->洗手
我:这是什么设计模式?怎么实现?
===================================================================
广告兄<同城广告网>:
设计模式的核心就是面向抽象编程,你首先让手成为一个抽象的类,而不只是手,是一个可以把头上的油揩下来的抽象类,就可以了。
这样头只需要跟这个抽象类对象打交道就行了,而不用跟洗手液打交道了,洗手液也是面向这个可以揩油的抽象类打交道。
我:
的确需要一个抽象基手,我有时用左手揩油,有时右手,有时双手齐下。
广告兄:
除了上述设计一个可以揩油的抽象基手,另一种设计是将揩油动作实现为一个接口,接口中封装的是动作, 洗手液可以是揩油接口的具体实现,肥皂也可以是揩油接口的具体实现。
该接口的具体对象可以是:洗手液,肥皂,洗头液,洗发水等等。
我:
这个就是简单工厂模式,获取具体的液体,采用简单工厂模式。
简单工厂模式的使用,传入一个字符串来标识使用哪种液体即可。就可以获取到对应的具体的液体对象。
然后再调用洗手方法。ps:注意,然后是洗手: 1.手揩油 -> 2.取液体 3.->洗手
那手揩头皮油这块,怎么实现?
广告兄:
你不是抽象的手吗,
我:
手,可能也会揩身上的油,甚至是桌子上的污渍。手还能打人耳光!手是多功能的类对象。
广告兄:
没错啊 , 那就让手实现这个接口。 把揩油动作封装成一个抽象类,让手实现这个揩油动作的接口。
根据设计背景增加细节思考1:
我:
A 取洗手液的时候,同一时刻,只能允许一个对象(一只手)来取。因为洗手液的瓶子只有一个出口。(如果有两只手来取洗手液,取洗手液时就需要排队)
我:
B 取液体,可以由手来取。也可以用嘴巴来吸!谁来取液体,这个也是个问题。我们需要的是一条通用的取液体的通道,提供这条通道就可以了,而不必关心谁来取。
广告兄:
实现取液体这个接口就可以了,或者说实现取液体这个抽象类。
我:
该抽象类内部维护一个取液体的纯虚函数。
广告兄:
C++中不太推荐,因为这样就是多重继承了,也就是说手是揩油动作这个抽象类的子类,也是取液体这个抽象类的子类。
手可以是任何类的子类,手甚至可以飞,只要实现飞的接口就可以了。手也可以游泳,实现游泳的接口就可以了。
我:
是的,手还能打人,擦屁股,放鞭炮,手的天生属性就是多功能。手,面临随时可能被拓展功能需求。
广告兄:
用C++的语言来说,就是实现相应的抽象类。
我:
你这个设计挺巧妙的,中文字面意思,我说的是手能打人,能洗手,能放鞭炮。
而你的实现相当于变成了: 会打人的有:手 。 会放鞭炮的有: 手 。
因为你的实现是让手成为打人这个抽象类的子类。
广告兄:
go中的接口全是这样的,不叫纯虚抽象类了,就叫接口,interface。
我:
小结,1.在手这个类中需要实现揩油和取液体,这俩虚函数定义。可以使用打印语句:"现在是手揩油",“现在是手在取液体” 作为函数体内容代替。
2,取液体,是个全局函数,内部使用简单工厂模式实现。
3,揩油,准确地说是揩头皮油,揩油也有很多细分场景,例如揩桌布油,揩机油,而我们当前需求是揩头皮油。
根据当前的聊天思路,揩头皮油揩桌布油,揩机油分别设计为不同的抽象类。
增加细节思考2 -- 升华模板技术!
我:
揩油,和取液体,语义上如此类似: 一个动词,后面跟一个名词!
那是不是可以使用模板技术,进一步提取和统一化呢?!
我想肯定可以! 有待日后提升!
这个函数模板的设计可能也有难点吧,这里头还使用了简单工厂模式。
可以称之为: 带简单工厂模式设计的函数模板。
.
编程源自生活:抽象 -> 生活中的洗头问题的更多相关文章
- [转载]生活在 Emacs 中
Brian Bilbrey2002 年 8 月 20 日发布 教程简介 本教程讲什么? Emacs 是一个流行的无模式文本编辑器,有许多强大的功能.本教程将教您使用 Emacs 的基础知识.为了让您很 ...
- Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义
Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...
- [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作
走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- Valentino发布2013秋冬高级定制系列_菁华时尚生活,时尚生活电子杂志,Fine Born China
Valentino发布2013秋冬高级定制系列_菁华时尚生活,时尚生活电子杂志,Fine Born China alentino发布2013秋冬高级定制系列 编辑: Mavis 图源于网络 图源于网络 ...
- VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。
原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...
- AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理
(1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- 走进异步编程的世界 - 在 GUI 中执行异步操作
转载:https://www.cnblogs.com/liqingwen/p/5877042.html 走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://w ...
随机推荐
- JS数组遍历的十二种方式
遍历有如下几种方式 数组方法 map forEach filter find findIndex every some reduce reduceRight 其他方法 for for in for o ...
- 表格取消全选框,用文字表示--Echarts ElementUi
1.先看看实现的图 一. 添加添加复选框列 <el-table v-loading="zongShipLoading" tooltip-effect="dark&q ...
- .net 安装部署诀窍
1.解决方案资源管理器中有多个类库项目和一个启动主项目时:各类库项目的生成路径设为bin\debug: 启动主项目的生成路径设成指定的主输出路径: 2.打包时在应用程序文件夹中添加主输出即可,主输出的 ...
- 模拟CMOS集成电路-单级放大器增益直观理解
我们再看辅助定理: 这里,Gm是指输出与地短接时的跨导:Rout表示当输入电压为零时的输出电阻.这个是书上的原话,但是在推算公式时发现,这两个量的定义还不是完全完整,我 的理解是: 首先Gm是等效跨导 ...
- Go语言使用swagger生成接口文档
swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言.Swagger与一组开源软件工具一起使用,以设计.构建.记录和使用RESTful Web服 ...
- ajax发送请求的时候url为空或者undefined会发生什么
$.ajax()里的url为空,ajax请求发送到当前自己的页面. 例如index.html里$.ajax()的url为空就发送到index.html
- 常用API【2】
常用API 1.Math类 1.1 Math类概述 Math包含执行基本数字运算的方法 没有构造方法,如何使用类中的成员呢? 看类的成员是否是静态的,如果是,可以通过类名直接调用 1.2Math类的常 ...
- 我的T440p出现怪事情了
装上系统后,再稍微装些软件,或是打补丁,升级驱动什么的,再重启就起不来了. 也就是说,装一次系统只能好一次,关机或是重启就启动不了了,现象是在黑屏界面转两下就转不动了. 鼓捣一个周末也无效,昨天上系统 ...
- 本地ubuntu 往阿里云ubuntu服务器传文件
起因 今天在本地ubuntu搭环境,弄好之后需要把本地的文件传到服务器上去... 本想着用xftp直接拖过去,结果连接不上,可能是我太菜了吧,只好百度找方法··· 这里就简单的记录一下吧~ 步骤 sc ...
- 浏览器调试的必知必会,零基础足够详细-第一节console面板、移动端调试
前言 本文已经发布视频点击查看 开发过程中,浏览器的调试非常重要,可以说是必备的技巧,本文我就会分享一些自己掌握的技巧,欢迎补充 我们默认使用Chrome浏览器,但是你使用新edge浏览器也是可以的 ...