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

06-02 1220阅读

目录

  • 前言
  • 试题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]=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()方法,对相关属性进行操作。这些在开发工具中,有时候会默认自动给出。结构如下所示:

        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关下进行挑战吧【整理中……】
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码