大家好,又见面了,我是你们的朋友全栈君。
在软考之前,对设计模式的理解只是停留在概念的层面上,通过这次系统的复习, 更加深刻的认识了设计模式。
考试前几天我们小组又串了一遍设计模式,总结了一些需要注意的点:
1.看类图
软考刚开始的时候做设计模式,觉得不需要看类图,根据前后代码就可以填空,直到最后才发现类图才是设计模式的核心。
拿到一个设计模式后,先看一下概念,接下来看的就是类图,图中有哪些抽象类,接口,具体类,类与类,类与接口有什么对应关系。
抽象(abstract)类(class)
接口(interface)
2.找关系
关系是转换成代码的关键,在类图中常见的关系有泛化,实现,关联(聚合,组合),依赖(在大话中有依赖和关联有明显的区分,在HeadFirst中都是用关联来体现的)。
从最简单的开始说起,泛化(也就是继承,只是看问题的角度不同),体现的是抽象类与具体类的关系,代码体现为:“具体类 extends 抽象类”
实现:一般为类与接口的关系,代码体现为:“类 implements 接口”。
……
曾经专门介绍过UML类图中的关系,就不一一介绍了。
3.图和代码的转换
最重要的一步就是将图转换成代码,因为写对了,就拿分了。
下面通过我们熟悉的组合模式来讲一讲分析思路。
首先看定义:组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
这么看定义也很难理解,下面继续分析
看类图
在这张图中,我们可以看到有Component抽象类,Leaf和Composite两个具体类,还有一个客户端用来实现对设计模式的调用。具体类Leaf和Composite继承了抽象类,Composite由Component聚合而成(个人认为这里聚合的真正对象是Leaf,因为抽象类是不能被实例化的)。
找到了类和关系后,我们就来实现代码和图的转换:
首先是继承关系
我们可以看到抽象类的表示方法为abstract class Compmonent,在抽象类中的方法,可以是抽象的,也可以是具体的,如果是抽象方法的话,在子类中必须重写抽象方法。
在这里也体现了构造函数的概念,个人理解重载和构造函数密不可分。这些是面向对象的具体知识,接下来会一一介绍。
在.net中子类继承父类,继承用“:”来表示,在Java中则用extends代替,这也就是.net和Java的不同之处。同样,实现接口在.net中也用“:”来表示,在Java中则用implements。
在子类Leaf中,也体现了对抽象方法的重写,简单的说,重写就是对方法内具体内容的重新编写。
接下来我们看聚合关系
Composite类
一般情况下,聚合关系是一种一对多的关系,所以在一的类中声明集合来存放聚合的类,体现了聚合关系。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105716.html原文链接:https://javaforall.cn