目录
前言
在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的经验。为了帮助其他同样正在为这门考试(证书)奋斗的朋友们,我决定将我的笔记整理出来,与大家分享。这些笔记不仅包含了书本上的知识 ,还加入了我对重点和难点的个人理解以及考试技巧,力求帮助大家更加高效地复习。我希望这份笔记能够成为你备考路上的一份支持,也祝愿你在考试中取得理想的成绩👍👍👍
如果有写的不好或者需要改进的地方,恳请在评论区指正!🤓🤓🤓
试题6 设计模式
6.1 理论知识
基础理论知识请参考此文章:23种设计模式
6.2 解题知识点
1、了解类与类(接口)之间的关系------接口是一种特殊的类
(1)接口的概念:接口只是说明类应该做什么,但并不指定应该如何去做。在实际开发过程中,通过类来实现接口。接口一般只有方法名,没有方法体。实现接口就是让其既有方法名又有方法体。
(2)接口的声明:接口用关键字"interface
"来声明。接口的形式跟类很相似。例1格式如下:
java
interface [接口名]{
...
}
(3)接口的实现
实现接口的类表示例2如下:(接例1接口的声明)
java
class [类名] implements [接口名]{
...
}
(4)特殊的接口方法:接口中的方法只有方法名没有方法体。(注意:没有花括号)例3如下:
java
interface [接口名]{
[返回类型void/String/...] [方法名] (参数列表);
}
(5)接口类与其实现类的对应关系:接口的用处就是让类通过实现它来执行一定的功能。因此实现接口的类,要实现接口的类。对于实现类或接口类有方法或属性的缺失,则可以根据二者的对应关系进行补充。一般实现类的方法是对接口类方法的具体实现。
2、继承
(1)继承的概念:继承,就是在已有类(父类)的基础上进行扩展,从而产生新的类(子类)。父类拥有自己的属性和方法,这些子类都可以继承。子类除了拥有父类的属性和方法外,还可以有自己的特性。
(2)继承的表示:继承通过关键字"extends
"表示。结构例4如下:
java
class [子类名] extends [父类名]{
...
}
(3)父类与子类之间的对应关系:子类的属性和方法有部分是从父类继承而来,一般而言,父类和子类之间同名的属性和方法具有一定的对应关系,子类也可以对父类的方法进行重写。
(4)super和this的使用
在继承关系中为了区分父类和子类,会用super代替父类指针,this代替子类指针。举例如下:
java
class [父类名] {
[属性1];
[父类名]([属性1]){ 属性1=1; }
}
class [子类名]{
[属性2];
[子类名]([属性1],[属性2]){
super([属性1]); //这里的super([属性1])时父类带属性1参数的构造函数
this.[属性2]=[属性2]; //这里的this是当前类指针
//加上this和super可以区分同名的属性或方法。子类可以利用super指针调用父类的属性和方法。
}
}
3、了解类的结构------属性和构造函数
(1)默认构造函数和非默认的构造函数:对类实例化创建对象时,系统会调用构造函数对其所属成员进行初始化。
在JAVA中,一般以与类名同名的方法作为构造函数。在实际开发过程中,系统会默认不带参数的构造函数,如果需要带参数的构造函数,需要明确写出该构造函数。构造函数结构例5如下:
java
class [类1]{
[属性1];
//[类1](){ } //默认无参构造函数
[类1](属性1 形参1){
this.属性1=形参1; //一般这里的形参命名与属性名一致
}
}
(2)继承中的构造函数:实际上,在创建子类对象时,会先执行其父类的构造函数,然后执行子类的构造函数,最后完成对象的创建。即创建子类对象时,先调用父类构造函数,初始化继承自父类的成员,随后调用子类构造函数,初始化子类的成员。例6如下:
java
class [父类名]{
[属性1];
[父类名](){
[属性1]=10;
System.out.println("这是父类构造函数");
}
}
class [子类名]{
[属性2];
[子类名](){
[属性2]=20;
System.out.println("这是子类构造函数");
}
}
//主函数测试
public class test{
public static void main(String [] args)
{
[子类名] [子类对象名]= new [子类名] ();
System.out.println([子类对象名] .[属性1]+" "+[子类对象名] .[属性2]);
}
}
//这里的输出结构应该是:
// 这是父类构造函数
// 这是子类构造函数
// 10 20
(3)get方法和set方法
在JAVA中会有对类中属性的get和set方法。在实际开发过程中,会对类的属性设定私有private限定,只有本类中的方法可以访问,拒绝其他类的访问。同时,会在本类中设定get()和set()方法,对相关属性进行操作。这些在开发工具中,有时候会默认自动给出。结构如下所示:
java
class [类名]{
private [数据类型] [属性1];
public [数据返回类型] get属性1(){
return [属性1];
}
public void set属性1([数据类型] [形参]){
this.[属性1]=[形参]; //这里的形参名一般与属性名一致
}
}
(4)其他函数:类中函数成员格式如下所示:
java
[访问控制符] [返回类型] [方法名] (形参1类型 形参名1,形参2类型 形参名2,...){ ... }
访问控制符可以为:private/public/default/protected/abstract
返回类型为该方法返回数据的数据类型。
返回语句 return [返回参数]
如果返回类型为void
,即返回类型为空时,不需要return语句。
4、访问控制符/类修饰符
private
(1)用private修饰的成员变量与成员方法只能在类的内部被访问,类的外部不能访问。public
(1)用public修饰数据表示所有的类都可以访问。
(2)用public修饰类,也表示所有类中可以访问。default
(1)用default修饰成员数据表示只有用一个包里的类才能访问。
(2)用default修饰类也表示只有一个包里的类才能访问。当在类前不加任何控制符时,默认就是default。protected
(1)用protected修饰成员数据表示不仅同一个包中的类可以访问,位于其他包中的子类也可以访问。abstract
(1)abstract可以用来修饰方法或类。具有一个或多个抽象方法的类,本身需要被定义为抽象类。抽象类不仅可以有抽象方法,还可以有具体方法。
(2)抽象类可以被继承,如果其子类没有实现抽象类全部的抽象方法,则子类也是抽象类,需要用abstract修饰。
(3)含有抽象方法的一定是抽象类,但抽象类可以没有抽象方法。抽象类不能实例化,不能new一个对象,但可以声明一个抽象类的变量指向具体的子类对象。
5、了解对象的实例化
(1)new一个对象
在主函数中,需要对类进行实例化才能够调用。而我们对类的实例化,一般用的是new。结构如下:
[类名] [对象名] = new [类名](参数列表);
(2)与超类相关的实例化
java
//创建子类对象并转到父类
[父类名] [对象名] = new [子类名](参数列表);
此时以对象名调用某方法(子类从父类直接继承而来的方法),虽然将父类对象句柄指向了子类对象,实际上操作的还是子类对象,只不过将对象句柄声明为父类的数据类型,此时编译器根据实际情况选择了子类的函数。
6、了解方法调用的格式: [对象名] . [方法名] ;
7、了解特殊的数据结构接口:List
(表单)
(1)将元素放到指定集合的结尾:[表单名]. add([元素名]);
(2)将集合2放到指定集合1的指定位置:[表单名1].addAll([位置序号],[表单名2]);
(3)清除集合:[表单名].clear();
Iterator(迭代器)--用迭代器访问表单
6.3 解题技巧
-
左父右子、左爷右孙
java父类名 对象名 = new 子类名();
-
new时,看构造体函数
- 有参:写参数,看参数类型,找对应
- 无参:直接写()
-
super没有点,即找父类构造函数
- super()
- super.xxx() 需要找父亲对应函数
-
看到setXXX ( ) { },不会的前提下优先考虑
this.xxx=xxx;
-
有抽象方法一定有抽象类
零基础蒙题技巧
- 以下基于没有基础的同学应付蒙题的技巧(只能达到50~90%蒙对),大概拿到9-12分,有基础的同学按照情景答题
- 在文中找答案,前面空白去后面找对应的答案
- 送分题:在一个类与另一个接口或者抽象类之间的填空,有
Interface
,写implements
实现(记住有s!),有abstract
抽象类,写extends
继承,记住单继承多实现!继承只有一个,实现可以多个。 - 先找父子,例如继承抽象类或者实现接口的关系,父亲有的抽象方法,继承子类的方法就会存在,不存在就抄进去。
- 数据类型填写【文中找相同答案】:查找相同单词前面被定义的类型是什么?如果是一个单词出现多次并且告诉你了类型,记住是出现多次并且名字相同,那么可以盲填了,例如2020年下半年(2)填空,因为出题一般不会**的让你填写基本数据类型!
- 有抽象方法一定是抽象类,抽象类不一定有抽象方法!如果看见一个类中有抽象方法abstract,那么此类一定是抽象类,有些空会出这种送分题!(零基础不理解的同学,记住就行!记住有抽象方法一定是抽象类,抽象类一定要用abstract修饰)
- 举例:2020年下半年试题六(教答题步骤看注释//)
- (4)(5)对零基础的同学会有些难度,能蒙就蒙,不能就放了
- 送分题:在一个类与另一个接口或者抽象类之间的填空,有
在线支付是电子商务的一个重要环节,不同的电子商务平台提供了不同的支付接口。现在需要整合不同电子商务平台的支付接口,使得客户在不同平台上购物时,不需要关心具体的支付接口。拟采用中介者(Mediator)设计模式来实现该需求,所设计的类图如图6-1所示。
java
import java.util.*;
interface WebServiceMediator { //1.1 看到(1)是接口,那么我们就去谁实现了这个WebServiceMediator接口,会发现只有ConcreteServiceMediator实现了这个接口,那么我们就去ConcreteServiceMediator这个类中找答案
public (1) ; // 1.4 答案:void buy(double money, WebService service)
public void SetAmazon(WebService amazon);
public void SetEbay(WebService ebay);
}
abstract class WebService {
// 2.1 看到这种定义数据类型的,你可以看看在同一个类中,有没有被定义,你会发现(2)的下一行就定义了mediator类型,如果你不确定,你继续看其他有这个单词mediator前面被定义的是什么类型,你会发现都是WebServiceMediator,那么就直接抄WebServiceMediator进去即可。
protected (2) mediator; // (2)答案:WebServiceMediator
public abstract void SetMediator(WebServiceMediator mediator);
// 3.1 是abstract抽象类,那么谁继承它,就去谁那里找,有两个继承它(一般有两个继承它,就去找两个相同的方法并且没有出现在这个抽象类中),找这个abstract class WebService抽象类中没有被定义的方法。
public (3) ; // (3)答案:abstract void buyService(double money)
public abstract void search(double money);
}
class ConcreteServiceMediator implements WebServiceMediator {
private WebService amazon;
private WebService ebay;
public ConcreteServiceMediator() {
amazon = null;
ebay = null;
}
public void SetAmazon(WebService amazon) { // 1.2 找(1)答案,这个出现了排除掉
this.amazon = amazon;
}
public void SetEbay(WebService ebay) { // 1.2 找(1)答案,这个也出现了,也可以排除掉
this.ebay = ebay;
}
public void buy(double money, WebService service) { // 1.3 找(1)答案,ok这个没有出现在接口WebServiceMediator中,那么就填它!直接将整个方法抄进去,不要抄方法体
if (service == amazon)
amazon.search(money);
else
ebay.search(money);
}
}
class Amazon extends WebService {
public void SetMediator(WebServiceMediator mediator) { // 3.2 出现了在抽象类abstract class WebService中可以排除
this.mediator = mediator;
}
public void buyService(double money) { // 3.4 只剩下这个没有出现在抽象类中,有可能这个是答案,如果不确定就去另一个继承它的类EBay验证答案
// 4.1【理解分析题】 因为是中介者模式,你购买东西就必须通过中介,而此方法中买这个服务,中介中有buy方法,那么就可以通过中介者来实现买,又因为SetMediator(WebServiceMediator mediator)定义的mediator都没有被用过,出题者一般不会给无用的信息出现多次并且还没有用过,因此这里可以通过中介者调用方法来实现买buy,即mediator.buy(money,this)
(4) ; // 答案:mediator.buy(money,this)
}
public void search(double money) { // 3.3 出现了可以排除
System.out.println("Amazon receive:" + money);
}
}
class Ebay extends WebService {
public void SetMediator(WebServiceMediator mediator) {
this.mediator = mediator;
}
public void buyService(double money) { // 3.5 你会发现,这个类也是两个方法都在抽象类中,只有这个buyService不在,那么答案只会是这个!
// (5)【理解分析题】
(5) ; // 答案:mediator.buy(money,this)
}
public void search(double money) {
System.out.println("Ebay receive:" + money);
}
}
后期可能还会继续更新......
结语
这份笔记由我在备考软件设计师中级考试的过程中编写,包含了我对知识点的理解与总结。如果您觉得这份笔记对您有帮助,并希望分享给更多的人,我十分乐意。但请在转载时务必注明出处,以尊重作者的劳动成果,感谢您的理解与支持
。
在此特别强调,本人编写笔记的所需部分资源均源于网络公开资源,旨在为大家提供一个学习和交流的内容,未经原作者授权,如若不慎侵犯您的合法权益,请您立即通过有效联系方式通知我,并附上相关证明材料
。一旦核实无误,我将在第一时间删除涉事资源,全力保障您的合法权利不受损害。
- 每篇一句:"为了未来好一点,此刻苦一点有什么。"
- 如果觉得对您有用,请点个赞或者收藏鼓励我持续更新吧!
- 恭喜您,已挑战成功第X关上,请前往第X关下进行挑战吧【整理中......】