1700459080
设计模式之禅 10.5 最佳实践
1700459081
1700459082
初级程序员在写程序的时候经常会问高手“父类怎么调用子类的方法”。这个问题很有普遍性,反正我是被问过好几回,那么父类是否可以调用子类的方法呢?我的回答是能,但强烈地、极度地不建议这么做,那该怎么做呢?
1700459083
1700459084
❑把子类传递到父类的有参构造中,然后调用。
1700459085
1700459086
❑使用反射的方式调用,你使用了反射还有谁不能调用的?!
1700459087
1700459088
❑父类调用子类的静态方法。
1700459089
1700459090
这三种都是父类直接调用子类的方法,好用不?好用!解决问题了吗?解决了!项目中允许使用不?不允许!我就一直没有搞懂为什么要用父类调用子类的方法。如果一定要调用子类,那为什么要继承它呢?搞不懂。其实这个问题可以换个角度去理解,父类建立框架,子类在重写了父类部分的方法后,再调用从父类继承的方法,产生不同的结果(而这正是模板方法模式)。这是不是也可以理解为父类调用了子类的方法呢?你修改了子类,影响了父类行为的结果,曲线救国的方式实现了父类依赖子类的场景,模板方法模式就是这种效果。
1700459091
1700459092
模板方法在一些开源框架中应用非常多,它提供了一个抽象类,然后开源框架写了一堆子类。在《XXX In Action》中就说明了,如果你需要扩展功能,可以继承这个抽象类,然后覆写protected方法,再然后就是调用一个类似execute方法,就完成你的扩展开发,非常容易扩展的一种模式。
1700459093
1700459094
1700459095
1700459096
1700459098
设计模式之禅 第11章 建造者模式
1700459099
1700459101
11.1 变化是永恒的
1700459102
1700459103
又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:“XX公司很满意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我们公司制作了,不过这次又额外增加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都由客户自己控制,他想什么顺序就什么顺序,这个没问题吧?”
1700459104
1700459105
那任务又是一个时间紧,工程量大的项目,为什么是“又”呢?因为基本上每个项目都是如此,我该怎么来完成这个任务呢?
1700459106
1700459107
首先,我们分析一下需求,奔驰、宝马都是一个产品,它们有共有的属性,XX公司关心的是单个模型的运行过程:奔驰模型A是先有引擎声音,然后再响喇叭;奔驰模型B是先启动起来,然后再有引擎声音,这才是XX公司要关心的。那到我们老大这边呢,就是满足人家的要求,要什么顺序就立马能产生什么顺序的模型出来。我就负责把老大的要求实现出来,而且还要是批量的,也就是说XX公司下单订购宝马A车模,我们老大马上就找我“生产一个这样的车模,启动完毕后,喇叭响一下”,然后我们就准备开始批量生产这些模型。由我生产出N多个奔驰和宝马车辆模型,这些车辆模型都有run()方法,但是具体到每一个模型的run()方法中间的执行任务的顺序是不同的,老大说要啥顺序,我就给啥顺序,最终客户买走后只能是既定的模型。好,需求还是比较复杂,我们先一个一个地解决,先从找一个最简单的切入点——产品类,每个车都是一个产品,如图11-1所示。
1700459108
1700459109
1700459110
1700459111
1700459112
图11-1 汽车模型类图
1700459113
1700459114
类图比较简单,在CarModel中我们定义了一个setSequence方法,车辆模型的这几个动作要如何排布,是在这个ArrayList中定义的。然后run()方法根据sequence定义的顺序完成指定的顺序动作,与第10章介绍的模板方法模式是不是非常类似?好,我们先看CarModel源代码,如代码清单11-1所示。
1700459115
1700459116
代码清单11-1 车辆模型的抽象类
1700459117
1700459118
public abstract class CarModel{
1700459119
1700459120
//这个参数是各个基本方法执行的顺序
1700459121
1700459122
private ArrayList<String>sequence=new ArrayList<String>();
1700459123
1700459124
//模型是启动开始跑了
1700459125
1700459126
protected abstract void start();
1700459127
1700459128
//能发动,那还要能停下来,那才是真本事
[
上一页 ]
[ :1.700459079e+09 ]
[
下一页 ]