当前位置: 首页 > article >正文

2024年软件设计师中级(软考中级)详细笔记【6】(下午题)试题6 Java 23种设计模式解题技巧(分值15)

目录

  • 前言
  • 试题6 设计模式
    • 6.1 理论知识
    • 6.2 解题知识点
    • 6.3 解题技巧
      • 零基础蒙题技巧
  • 结语


前言

在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的经验。为了帮助其他同样正在为这门考试(证书)奋斗的朋友们,我决定将我的笔记整理出来,与大家分享。这些笔记不仅包含了书本上的知识,还加入了我对重点和难点的个人理解以及考试技巧,力求帮助大家更加高效地复习。我希望这份笔记能够成为你备考路上的一份支持,也祝愿你在考试中取得理想的成绩👍👍👍

如果有写的不好或者需要改进的地方,恳请在评论区指正!🤓🤓🤓


试题6 设计模式

6.1 理论知识

基础理论知识请参考此文章:23种设计模式

6.2 解题知识点

1、了解类与类(接口)之间的关系——接口是一种特殊的类
(1)接口的概念:接口只是说明类应该做什么,但并不指定应该如何去做。在实际开发过程中,通过类来实现接口。接口一般只有方法名,没有方法体。实现接口就是让其既有方法名又有方法体。
(2)接口的声明:接口用关键字“interface”来声明。接口的形式跟类很相似。例1格式如下:

interface [接口名]{}

(3)接口的实现
实现接口的类表示例2如下:(接例1接口的声明)


class  [类名]  implements  [接口名]{}

(4)特殊的接口方法:接口中的方法只有方法名没有方法体。(注意:没有花括号)例3如下:

interface [接口名]{
		[返回类型void/String/] [方法名] (参数列表);
}

(5)接口类与其实现类的对应关系:接口的用处就是让类通过实现它来执行一定的功能。因此实现接口的类,要实现接口的类。对于实现类或接口类有方法或属性的缺失,则可以根据二者的对应关系进行补充。一般实现类的方法是对接口类方法的具体实现。

2、继承
(1)继承的概念:继承,就是在已有类(父类)的基础上进行扩展,从而产生新的类(子类)。父类拥有自己的属性和方法,这些子类都可以继承。子类除了拥有父类的属性和方法外,还可以有自己的特性。

(2)继承的表示:继承通过关键字“extends”表示。结构例4如下:

class [子类名] extends [父类名]{} 

(3)父类与子类之间的对应关系:子类的属性和方法有部分是从父类继承而来,一般而言,父类和子类之间同名的属性和方法具有一定的对应关系,子类也可以对父类的方法进行重写。
(4)super和this的使用
在继承关系中为了区分父类和子类,会用super代替父类指针,this代替子类指针。举例如下:

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如下:

class [1]{
		[属性1]//[类1](){ }  //默认无参构造函数
		[1](属性1  形参1{
			this.属性1=形参1//一般这里的形参命名与属性名一致
}
}

(2)继承中的构造函数:实际上,在创建子类对象时,会先执行其父类的构造函数,然后执行子类的构造函数,最后完成对象的创建。即创建子类对象时,先调用父类构造函数,初始化继承自父类的成员,随后调用子类构造函数,初始化子类的成员。例6如下:

class [父类名]{
	[属性1][父类名](){
			[属性1]=10System.out.println(“这是父类构造函数”);
	}
}
class  [子类名]{
		[属性2][子类名](){
			[属性2]=20System.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()方法,对相关属性进行操作。这些在开发工具中,有时候会默认自动给出。结构如下所示:

class [类名]{
		private [数据类型] [属性1]public [数据返回类型] get属性1(){
				return [属性1]}
public void set属性1[数据类型] [形参]{
			this.[属性1]=[形参]//这里的形参名一般与属性名一致
	}
}

(4)其他函数:类中函数成员格式如下所示:

[访问控制符] [返回类型] [方法名] (形参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)与超类相关的实例化

//创建子类对象并转到父类
[父类名] [对象名] = new [子类名](参数列表);

此时以对象名调用某方法(子类从父类直接继承而来的方法),虽然将父类对象句柄指向了子类对象,实际上操作的还是子类对象,只不过将对象句柄声明为父类的数据类型,此时编译器根据实际情况选择了子类的函数。

6、了解方法调用的格式: [对象名] . [方法名] ;
7、了解特殊的数据结构接口:List(表单)
(1)将元素放到指定集合的结尾:[表单名]. add([元素名]);
(2)将集合2放到指定集合1的指定位置:[表单名1].addAll([位置序号],[表单名2]);
(3)清除集合:[表单名].clear();
Iterator(迭代器)–用迭代器访问表单

6.3 解题技巧

  • 左父右子、左爷右孙

    父类名 对象名 = 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所示。

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关下进行挑战吧【整理中……】

http://www.kler.cn/news/359537.html

相关文章:

  • 前端自动化测试框架Jest
  • 数据结构与算法--返回袋子数
  • Spring-Bean的实例化和依赖注入方式
  • Spring Boot 2.7=>3.0 升级整理
  • 【进阶OpenCV】 (12)--人脸检测识别
  • 基于SpringBoot+Vue的旅游服务平台【提供源码+答辩PPT+参考文档+项目部署】
  • 智能优化算法-生物地理学算法(BBO)(附源码)
  • 学习ROS系列 python语言
  • 起吊机革新:协议转换器解锁安全与效率
  • 提示词高级阶段学习day2.1-在提示词编写中对{}的使用教程
  • Python机器学习中的主成分分析(PCA)全面解析与应用
  • 深度学习 自动求梯度
  • kubernetes(k8s)面试之2024
  • Spring Boot:中小型医院网站开发新趋势
  • react18中如何实现同步的setState来实现所见即所得的效果
  • 【C语言】文件操作(2)(文件缓冲区和随机读取函数)
  • 当物理学奖遇上机器学习:创新融合的里程碑
  • Unity修改鼠标指针大小
  • nginx中的HTTP 负载均衡
  • 【python+Redis】hash修改