2020-7-7 说一说怎么封装我们的java类(钩子方法和基础封装以及覆盖、protected的关系)
什么是钩子方法
顾名思义,钩子方法就像钓鱼一样,不过调的是子类的方法钩子方法的结构 子类 【 钩子方法()(impl)】(ex)
—>父类(abstract)【钩子方法()(abstract声明)+其他方法()【钩子方法调用】】
注:impl是实现 abstract 虚类/方法
ex —> 继承关系 【】包含关系
其实就是父类声明了需要使用的方法,但是由子类实现
优点:在设计模式中说的比较清楚,是将方法的实现延时到了子类中。钩子方法在设计模型的经典应用是工厂方法模式
例如:
在此处我使用了工厂模式的钩子方法,在构造器中将会调用子类的钩子方法实现来添加初始化元素数组。
钩子方法和覆盖的关系
1、钩子方法是声明的 子类必须实现它,而方法的覆盖是可选的。
2、被覆盖的方法相当于钩子方法的声明
二者的使用情况
因为覆盖是有初始化的,所以即使不实现也不会报错。这对于改动来说变少了。但是,如果一个方法被子类多次的重写,还是使用钩子方法好。
如果一个方法是必现被实现的,但是因为其他原因,不能再父类中实现。请使用钩子方法()。
这种情况是存在的 比如我的第一个例子中假设,元素数组添加元素。在使用元素数组的时候将会出现空指针等问题。而这个类的每个子类都需要进行添加
元素进去元素数组的操作。所以这个时候使用钩子方法而不是覆盖是很明智的选择。
protected类型的使用
protected使用在父类中用来声明只有子类和本类可调此元素,对其他的类屏蔽。protected用来声明可以被覆盖的方法是很好的,被覆盖没有意义的方法请声明成私有类型。父类中使用protected类声明属性达到和子类共享此属性。外界入口使用public声明
例如
怎么样重写封装我们的方法
在实践中,编码是一个迭代的过程,一开始就自动声明进行封装是很困难的。所有我们不妨先进行简单的声明父类,然后实现其一个子类,在实现第二个子类后在进行对比,然后考虑将共有的、反复使用的属性进行父类封装。独有的类型和方法有钩子方法或者覆盖来实现。声明好方法的可见性。就封装好了我们的父类。