编程源自生活:抽象 -> 生活中的洗头问题
设计背景:
我:头上的油揩给了手,手接触洗手液。洗手液伤头皮,这样头皮就不会和洗手液接触了。
具体执行过程描述: 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 ...
随机推荐
- python小白入门基础(三:整型)
# Number(int float str complex) #int 整型(正整数 0 负整数)intvar_1 = 100print(intvar_1)invar_2 = 0 print(inv ...
- 启动oracle11监听器错误
启动oracle11监听器错误:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案 . 关键字:启动oracle10监听器错误:本地计算机上的Ora ...
- 17_Python的常用模块
1.随机数模块 random 1.随机小数 import random # (0,1)随机取浮点数 random.random() # 0.17988578778011 # (1, 3)取指定范围的浮 ...
- 来讲讲你对ThreadLocal的理解
前言 面试的时候被问到ThreadLocal的相关知识,没有回答好(奶奶的,现在感觉问啥都能被问倒),所以我决定先解决这几次面试中都遇到的高频问题,把这几个硬骨头都能理解的透彻的说出来了,感觉最起码不 ...
- python基础 格式化输出
格式化输出 '%s %d %.2f' % ('Novak', 33, 1.88) 需要逗号
- ckeditor4.0以上使用行间距插件lineheight报错修改
①从百度上下载一个 ckeditor 行距包,解压放到ckeditor/plugins目录下. ②在config.js 中添加 config.extraPlugins += (config.extra ...
- Linux:安装php
一.环境准备(lamp环境:linux+apache+php+mysql) 1.安装php之前,首先要检查一下相关lib库 rpm -qa zlib libxml libjpeg freetype ...
- pytest测试框架 -- setup和teardown等
一.用例运行级别 1.函数级别(setup.teardown 或 setup_function.teardown_function): 仅对处于同作用域的测试函数有效(该函数定义不在类中,则对非类中测 ...
- PHP实现Restful风格的API(转)
Restful是一种设计风格而不是标准,比如一个接口原本是这样的: http://www1.qixoo.com/user/view/id/1表示获取id为1的用户信息,如果使用Restful风格,可以 ...
- [LeetCode]67. 二进制求和(字符串)(数学)
题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 题解 两个字符串从低位开始加,前面位不够补0.维护进位,最后加上最后一个进位,最后反转结果字 ...