闲聊设计模式3-抽象才是可拓展的绝对保证

tech2023-03-06  74

从“接口”开始探讨

    接口是从抽象类发展而来的,就字面意思而言,无论是”接口“还是”抽象“,都是一种抽象含义。往大了说抽象就是找共同点,人类总是喜欢总结一些规律,从牛顿提出的万有引力,到后来爱因斯坦希望实现的大一统。都是在希望用一种更简单的理论去解释自然规律。抱歉,有点跑偏了,我只是想说,软件工程包括其他领域应该也是这样的。

    当前能够想到的接口作用有以下,后续想到的也会添加进来,然后总结共同点,争取有一个合理的分类。

规范,比如某种型号的螺丝钉就是一种规范,不同的厂家都会按照规范生产。之所以提到型号,是因为型号是一种约定的抽象属性,也就是规范,但是材质,颜色就不是,所以你可以diy一些个性的螺丝钉,但是要想卖出去,型号就不能胡来了。那么型号应该就可以理解成一种接口。(规范是抽象的,实现是具体的)流程,有些产品有自己的加工流程,比如加工一个圣诞苹果(就是那种包装好的苹果),需要购买苹果,然后购买圣诞节礼盒,然后包装起来。这些流程大体相同,但是每个人呢又有自己的实现方式。这个也就是我们熟悉的建造者模式。(流程是抽象的,实现是具体的)类型,我们之所以把金毛与哈士奇都划分为狗,就是因为我们做了一个抽象。那么分类的依据就是接口。除了自然界,Java的集合中也有体现,比如Map分为HashMap与LinkedMap等。(类型是抽象的,实现是具体的)

以上,不言而喻,你可以就一个接口,可以有无限个实现类,那么可拓展性就出来了。

可拓展性可能是开闭原则(对拓展开放,对修改关闭)提到的内容。符合这个原则的设计模式基本上都会有接口。后续,会依次论证的。另外一个原则-依赖倒置原则(核心思想是面向接口编程)其实就是帮助实现开闭原则的,当然也正好佐证了这个观点。

论证可拓展性

从业务角度论证

创建模式

简易工厂模式--只对”产品“做了抽象=>产品可拓展工厂方法模式--工厂与产品都做了抽象=>工厂/产品都可拓展至于抽象工厂模式--只是从产品衍生到了产品族的概念,也就是一系列相关的产品。比如说:之前有一家个水果加工厂能够生产果汁,葡萄生产线负责生产葡萄汁,橘子生产线负责生产橘子汁【工厂方法模式】 后来他们引进了设备还能够生产水果糖。那么每个生产线就要多做一点事情了。葡萄生产线生产的水果汁就是葡萄汁,生产的水果糖就是葡萄味水果糖【抽象工厂模式】建造者模式--建造过程抽象--建造过程可拓展

行为模式

策略模式--所有具体策略类都继承同一个接口,具体策略类可拓展。抽象+重写模板方法模式--流程(多个方法的调用)放到父类,通用方法放到父类,个性方法放到子类。抽象+重写

后续补充论证内容

 

从代码角度论证

    其实设计模式更偏向于业务,业务是对问题的直接抽象,业务之后才是代码。代码是实现,业务是问题分析。所以先后顺序应该是业务->代码。而且无论是业务还是代码,都可以用流程图画出来,这样会更清晰。所以从某种角度说。流程图也是一种语言,是一种抽象语言,具体实现依赖与java,c,c++等。不好意思,跑偏了,继续...

    从代码角度论证,就要从抽象类可能出现在什么地方说起了。

方法内部(临时变量,这种就是简单的依赖关系)参数:作为参数出现,常见的有建造者模式,策略模式。比如: /** * 给一个建造者,就能造一个对应的电脑 * 给我一个联想电脑的建造者,我就能给你造一台联想 * 给我一个苹果电脑的建造者,我就能给你造一台苹果 * ... * “导演”只决定流程,但是不决定具体实现。 */ public class ComputerDirector { public void makeComputer(ComputerBuilder builder){ builder.setUsbCount(); builder.setDisplay(); builder.setKeyboard(); } } /** * 费用由交通方式决定 * 你选择交通方式,我告诉你费用 * 不同的交通方式,就是不同的策略 */ public static void main(String[] args) { TrafficFeeCalculator calculator=new TrafficFeeCalculator(); calculator.goToTianJinEye(new ByBus(),10))); calculator.goToTianJinEye(new ByDiDiExpress(),10))); calculator.goToTianJinEye(new BySharedBicycle(),10))); } //参考: https://zhuanlan.zhihu.com/p/58093669 https://zhuanlan.zhihu.com/p/64584526 类属性(这种一般是属于组合或者聚合关系)

拓展

其实设计模式本质上就是一种抽象,抽象出代码的共同点,抽象出事物的共同点,抽象别人的抽象。通俗一点说,就是抽象无止境,哈哈哈。再说一句废话,抽象级别越高,包括的范围就越大。【年轻时,别人问你喜欢什么样的女孩,会说漂亮的身材好的,到了一定阶段,发现找不到,别人问你对相亲对象有什么要求,你会说”女的就行“。你看,更抽象了,范围也就更大了】

最新回复(0)