编程源自生活:抽象 -> 生活中的洗头问题
设计背景:
我:头上的油揩给了手,手接触洗手液。洗手液伤头皮,这样头皮就不会和洗手液接触了。
具体执行过程描述: 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 ...
随机推荐
- zero:如何找到SEO流量的突破口
http://www.wocaoseo.com/thread-326-1-1.html 之前一篇文章已有提到过,SEO可以分为两个阶段: 一个阶段是了解点SEO知识,然后就到网站上去找页面,看哪些招式 ...
- JAVA开源软件的技术选型--开源软件诞生2
技术准备--第2篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址,点亮星标,支持一下,万分感谢 码云:https://gitee.com/redragon/redragon-erp github: ...
- Three.js学习1_快速入门
快速上手, 搭建第一个3D场景 最重要的一步, 先下载three.js, 引入网页中 <script src="./three.js"></script> ...
- vue-cli3.0 vue脚手架3.0的使用
1.安装vue-cli 3.0 npm install -g @vue/cli # or yarn globaladd @vue/cli 安装成功后查看版本:vue -V(大写的V) 2.命令 ...
- django学习(二)
1.反向解析 什么是方向解析呢? 通过一些方法得到一个结果,该结果可以直接访问对应url出发视图函数. 先给一个路由和视图函数起一个别名.但是我们要注意的是反向解析的别名是不可以冲突的!!!不然会出现 ...
- 安装cnpm设置npm淘宝镜像源
安装cnpm npm install -g cnpm 验证npm镜像源 npm config get registry 题外话:cnpm和npm区别? cnpm其实就是在npm的基础上将镜像源更换到国 ...
- 跟着尚硅谷系统学习Docker-【day05】
day05-20200717 p21.docker容器数据卷容器 就是活动硬盘上面挂载硬盘进行数据的传递. [docker run -it --name dc01 fyr/centos ...
- URL 去重的 6 种方案!(附详细实现代码)
URL 去重在我们日常工作中和面试中很常遇到,比如这些: 可以看出,包括阿里,网易云.优酷.作业帮等知名互联网公司都出现过类似的面试题,而且和 URL 去重比较类似的,如 IP 黑/白名单判断等也经常 ...
- pwnable.kr之flag
拿到文件,先运行一下,输出: I will malloc() and strcpy the flag there. take it. 用python查看文件是否有什么保护, Arch: amd64-- ...
- 搭建MQTT学习平台
关于MQTT协议的介绍就不赘述了,网上资料非常多,直接入正题. MQTT协议的实现非常多,我选择了一个非常轻量级的开源项目来学习MQTT协议——mosquitto,官网:www.mosquitto.o ...