设计模式考试资料

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、编程论述题:框架设计者

1. 以SortTest和IntSort为例,说明什么是控制反转IoC

(1)SortorTest->BubbleSort。客户依赖具体的服务BubbleSort。

(2)SortorTest->IntSort<=BubbleSort。应用程序SortorTest遵循针对接口编程/抽象依赖原则,依赖抽象类型IntSort,而BubbleSort自然地依赖父类型。

(3)【SortorTest->IntSort】。这一步是关键。如果需要将控制模块SortorTest设计成框架,可以将控制模块SortorTest和它必须依赖的抽象类型IntSort打包。控制模块SortorTest从应用程序(上层模块)变为框架(下层模块),为控制反转(Inversion ofControl)。最好能够提供JavaDoc,并且将方法名sort 改成soooooort。

(4)Main->【SortorTest->IntSort】<=BubbleSort。(其他程序员)使用框架。

(5)带main的BubbleSort,BubbleSort->【SortorTest ->IntSort】<=BubbleSort。与第一步“依赖倒置”。

反映了某些应用程序员的失落心情:从自由自在变为受控于人

2.什么是抽象依赖原则,它与应用程序、框架的关系

是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

在应用程序设计和框架设计中,抽象依赖原则/ADP均有重要作用。在应用程序的编程中,可以把ADP视为一种规劝或忠告;而在框架设计中,依赖抽象类型则是条例和军规。

3. 有一个接口如下

package util;

@FunctionalInterface public interface DoubleOP {

double op(double m,double n) ;

}

编写应用程序App,以DoubleOP 的实现类、匿名类和λ表达式提供回调函数,分别完成m-n、m*n*n和求m与n大值功能。

package abc;

import tool.God;

import util.DoubleOP;

import util.Main;

public class App{

public static void main(String[] args){

DoubleOP f = (DoubleOP)God.create("2065");

double d = Main.runFramework(f,1.2,3.4);

System.out.println(d);

}

public static void test(){

double d = Main.runFramework(new HelloWorld(),1,3);

System.out.println(d);

DoubleOP f = (double m,double n)->{return m * n *n;};

d = Main.runFramework(f,1,3);

System.out.println(d);

f = (m,n)->{return m +2*n ;};

d = Main.runFramework(f,1,3);

System.out.println(d);

d = Main.runFramework((m,n)->{return m-n ;},1,3);

System.out.println(d);

}

}

二、论述题:Parnas原则

1. 什么是Parnas原则,它在软件设计中的地位

Parnas原则被称为接口与实现的分离。

Parnas原则是软件工程中最重要的原则,之所以将它作为面向对象的三大原则,是因为“该原则在对象技术中的一系列的推广和应用,Parnas原则是功能抽象的核心,也是数据抽象、封装的底层依据”。

3.什么是针对接口编程,什么是类的接口,Java中如何限定类的接口

类的接口指外界对象能够访问的、类所定义的接口的集合。通常,类中声明的public、protected域,也作为类接口的一部分。

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

(1)接口不提供代码重用性。接口并不能使你获得代码继承的好处,它没有代码重用能力。接口的意义在于获得程序设计上的高度可维护性。

(2)接口能够通过多继承进行扩展父接口。Java支持接口多继承。interface A extends B, C, D{}

(3)接口不能升级。定义接口时要考虑周全,因为接口有个十分尴尬的限制:如果定义了接口,将接口送给客户程序员使用,这时定义的接口就不能修改。因为在接口中添加一个方法,会导致老版本接口的所有实现类的中断。为了达到在接口中增加一个方法的目的,只能派生/创建一个新的接口。(所以,Java接口天然符合OCP/开放封闭原则)

三、编程论述题:装饰模式

1.以类图介绍装饰模式,介绍其意图、角色。

意图:装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

角色:

●抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

●具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

●装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

●具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

2. 按照Num模型,讨论职业/ IProfession类层次。IProfession定义了方法say(String),其实现类教师/ Teacher、医生、律师……按照其职业习惯给出say(String)的实现,这些实现类相当于Num模型中的Zero。而才艺/Talent类层次(相当于NextOne),可以装饰基本对象,say(String)实现中,在必要的时候会说english、在必要的时候会唱几句……

public interface IProfession {

abstract public void say(String s);

}

package closure.decorator;

import static yqj2065.util.Print.pln;

public class Teacher implements IProfession{

相关文档
最新文档