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

目录

  • 前言
  • [试题6 设计模式](#试题6 设计模式)
    • [6.1 理论知识](#6.1 理论知识)
    • [6.2 解题知识点](#6.2 解题知识点)
    • [6.3 解题技巧](#6.3 解题技巧)
  • 结语

前言

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

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


试题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关下进行挑战吧【整理中......】
相关推荐
程序员-小李几秒前
餐厅下单助手系统(Java+MySQL)
java·开发语言·mysql
开心工作室_kaic5 分钟前
springboot496基于java手机销售网站设计和实现(论文+源码)_kaic
java·开发语言·智能手机
像少年啦飞驰点、6 分钟前
SpringBoot + HttpSession 自定义生成sessionId
java·开发语言
珊珊来吃11 分钟前
EXCEL中给某一列数据加上双引号
java·前端·excel
我曾经是个程序员18 分钟前
使用C#生成一张1G大小的空白图片
java·算法·c#
向阳121822 分钟前
mybatis SqlSessionFactory
java·mybatis
mask哥23 分钟前
算法:LeetCode470_用Rand7()实现Rand10()_java实现
java·开发语言
搬码后生仔25 分钟前
将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中 (如 Serilog)
后端·asp.net
Suwg20927 分钟前
《手写Mybatis渐进式源码实践》实践笔记(第七章 SQL执行器的创建和使用)
java·数据库·笔记·后端·sql·mybatis·模板方法模式
丁总学Java31 分钟前
优化 invite_codes 表的 SQL 创建语句
java·数据库·sql