课程《设计模式之美》笔记
写在前面:一句话总结
封装隐藏属性(private、public、protected)
抽象隐藏方法(implements)
继承支持复用(extends)
多态支持扩展(继承/抽象+override)
1、封装特性的意义
只暴露必要操作,调用者不需要了解背后的逻辑细节,减少错用的概率,提高类的易用性。(隐藏信息:只public 必要的操作、保护数据:private属性)
2、抽象特性的意义
隐藏了接口类的具体实现。implements
抽象其实是一种设计思想,即只暴露关键功能、隐掉实现细节,命名时也需要这种思想,不要再方法定义中,暴露太多的实现细节,以保证在某个时间点需要改变方法的实现逻辑的时候,不用去修改其定义。举个例子,getAliyunPictureUrl() 就没有getPictureUrl()好。
3、继承特性的意义
最大的好处就是代码复用,子类继承extends父类的方法属性等。假如两个类有一些相同的属性和方法,我们可以将相同的part抽取到父类,让两个子类继承父类。但不要过度使用继承,层次过深过于复杂反而会导致代码可读性变差、可维护性变差。
很多人觉得继承是反模式,少用继承?
4、多态特性的意义
子类可以替换父类(extends)
父类 x1 = new 子类();
多态需要编程语言提供特殊的语法机制来实现:首先是这个语法机制要可以支持父类对象可以应用子类对象,也就是子类可以传递给父类;其次是要支持继承,也就是子类继承了父类,才能将子类传递给父类;最后是要支持子类可重写override 父类中的方法,也就是子类重写了父类的具体方法。
这三个机制实现了多态,x1看起来是父类,实际上实际调用的方法是子类里写的。
除了继承+override可以实现多态,接口类语法implements以及duck-typing语法也可以实现。
接口类的实现其实跟继承的差不多,只是父类是个接口类,子类不是继承,是implements父类,重写接口类的接口,具体使用的时候也是具体实现类传递给接口抽象类。
duck-typing只有一些动态语言才支持。
duck-typing实现多态非常灵活,两个类不需要有任何关系,只要定义了同一个名字的方法,就可以实现传递。
多态特性提高了代码的可扩展性和复用性,去掉了冗余的if-else语句。
多态是很多设计模式、设计原则、编程技巧的实现基础。
个人思考:从前只是知道这样用能实现一个怎样的效果,没有想过存在背后的意义,以后遇到一些设计无论难度大小都应该去主动思考其存在的意义。