2023-06-24
java
00
请注意,本文编写于 578 天前,最后修改于 578 天前,其中某些信息可能已经过时。

目录

🧠选择题
三层架构
MVC架构
🧠填空题
🧠判断题
🧠名词解释
软件项目框架(框架是规则、规范)
单一职责
高内聚低耦合
依赖倒置
热更新
🧠简答题
请简述观察者模式的应用
请简述单例模式的应用
请简述MVC中模型层的作用
请简述三层架构中数据访问层的作用
开发一款游戏软件,优先选择三层架构还是MVC架构?开发一款桌面应用,优先选择三层架构还是MVC架构?
🧠综合题
请画出PureMVC完整架构图并详细分析
请画出MVC完整架构图并详细分析
用单例模式设计用户数据类,用户数据类需要有金币的数量、增加金币、减少金币、显示金币的接口,并调用
User.java
TestUser.java
用观察者模式设计消息中心类,实现监听、移除监听、消息发送,并调用
MyObserver.java
MessageObserver.java
Subject.java
MessageCenter.java
TestObserver.java

🧠选择题

三层架构

  • 表示层(UI)
  • 业务逻辑层(BLL)
  • 数据访问层(DAL)

MVC架构

  • 视图层(View)
  • 控制器层(Controller) 逻辑处理
  • 业务层(Service)
  • 数据访问层(Dao)
  • 模型层(Model) 数据逻辑和业务规则

🧠填空题

1、观察者模式中,解决了一个对象____给其他对象通知的问题,而且还考虑到____,保证高度的协作。

2、外观模式隐藏系统的____,并向客户端提供了一个客户端可以访问____。

4、MVC框架中控制器接受____并调用____去完成用户的需求。

5、三层架构的优点是____,可以降低____。

6、中介者模式是用来降低____。这种模式提供了一个____,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

7、设计模式代表了____,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的____。

8、PureMVC是在基于模型、视图和____模式建立的一个轻量级的____。

🧠判断题

1、对于IT项目采用哪种架构来开发,采用哪种设计模式来实现,要根据项目的实际需求来确定。                                   (对 )

2、MVC框架中控制器层可以发送给模型层命令/消息。             ( 对 )

3、三层架构的数据访问层不一定是来源于本地数据库。          ( 对 )

4、对于有服务器的联网项目,在设计数据通信模块需要考虑传输数据的加密,但不需要考虑数据的压缩。                                 ( 错 )

5、软件架构中的管理类一般都需要提供对外接口。            ( 对  )

6、外观模式实现了子系统与客户端之间的松耦合关系。         (对)

7、在PureMVC框架中利用中介者模式有效的隔离了View层与Controller和Model层的耦合。                                         (对)

8、软件架构中,配置表的实现也是重要的模块之一,但是配置表不可以取代数据库。                                                  (对)

🧠名词解释

软件项目框架(框架是规则、规范)

指在软件开发过程中使用的一种结构或组织方式,用于指导和管理整个软件项目的开发过程。

它提供了一套约定、规范和工具,用于规划、设计、开发、测试和部署软件项目。

软件项目框架通常包括以下方面:

  1. 结构组织(Struction):定义了软件项目的整体结构和组织方式,包括模块划分、层次结构、组件关系等。它提供了一种清晰的组织结构,使开发人员能够更好地理解和管理项目。

  2. 开发规范(Development):定义了在项目中使用的编码规范、命名规范、注释规范等。它确保项目成员之间的代码风格一致,提高代码的可读性和可维护性。

  3. 设计模式(Design):提供了一些常用的设计模式,用于解决软件开发中的常见问题。这些设计模式经过验证和实践,可以帮助开发人员更好地设计和实现软件系统。

  4. 工具支持(Tool):提供了一些开发工具和工具集,用于辅助软件项目的开发和管理。这些工具可以包括版本控制系统、构建工具、集成开发环境(IDE)、测试框架等。

  5. 最佳实践(Practice):提供了一些在软件开发过程中被认为是最佳实践的原则和方法。这些最佳实践是通过经验总结和业界共识得出的,可以帮助开发人员避免常见的错误和问题,提高软件质量和效率。

单一职责

==它规定一个类只有一个职责。
降低类的复杂度、提高类的可读性、提高系统的可维护性、降低变更引起的风险==

ad
不要存在多于一个导致类变更的原因
一个类/接口/方法只负责一项职责。
优点:降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险。

高内聚低耦合

高内聚低耦合是软件设计和架构的一个原则

高内聚表示模块或组件内部的元素(如类、方法、函数)应该高度相关,彼此紧密协作,完成特定的功能或职责。

低耦合表示模块或组件之间的依赖关系应该尽可能松散模块之间相互影响和依赖应该最小化

目的:使得模块的可重用性、移植性大大增强。
提高	
	可维护性
	可复用性
	灵活性
	可测试性
	可理解性

依赖倒置

它强调高层模块不应该直接依赖于低层模块,而是应该通过抽象来进行解耦,同时低层模块也不应该依赖于高层模块的具体实现细节,而是依赖于抽象。

优点:提高代码的可维护性、可测试性和可复用性。

热更新

软件运行过程中,无需停止或重启系统,对软件进行更新和修改的技术。

减少了系统停机时间和用户的中断,同时提升了开发和部署的便利性

🧠简答题

请简述观察者模式的应用

用于在对象之间建立一种一对多的依赖关系,使得当一个对象状态发生变化时,所有依赖它的对象都会得到通知并自动更新;

消息通知系统,发布-订阅模式,MVC架构中视图与模型之间的通信;

请简述单例模式的应用

保证内存中只有唯一一个对象;

适用于需要全局访问和共享资源的场景,如资源共享、配置信息、对话框、窗口等GUI组件等。

请简述MVC中模型层的作用

负责持久层的数据的访问与存储

请简述三层架构中数据访问层的作用

负责业务逻辑和业务规范,实现模型层和表示层之间的解耦;

作用:执行业务逻辑、协调模型层和表示层、数据校验验证、事务管理、领域模型的定义;

开发一款游戏软件,优先选择三层架构还是MVC架构?开发一款桌面应用,优先选择三层架构还是MVC架构?

游戏比较复杂一点,一般用MVC

三层架构一般适合开发桌面应用

三层架构的优势:

  1. 分层结构清晰:三层架构将应用程序分为表示层、业务逻辑层和数据访问层,使各层之间的职责清晰明确,易于理解和维护。

  2. 可扩展性强:由于职责划分清晰,可以方便地对某一层进行扩展或替换,而不会对其他层产生影响。

  3. 可重用性高:各层之间的解耦性较好,使得每个层都可以独立开发、测试和重用。

  4. 数据访问优化:数据访问层可以专注于优化数据访问的性能和效率,提供缓存、索引等机制。

适用场景: 三层架构适合需要关注数据持久化和数据访问层优化的应用,对于游戏软件来说,如果需要大量的数据存储和复杂的数据操作,例如玩家数据、游戏关卡等,三层架构可以提供良好的数据管理和访问效率。

MVC架构的优势:

  1. 分离关注点:MVC架构将应用程序分为模型、视图和控制器,实现了业务逻辑、用户界面和用户交互的分离,使得各个组件可以独立开发和测试。

  2. 可维护性高:模型、视图和控制器的分工合作使得代码的组织和维护更加清晰和方便。

  3. 可测试性好:模型、视图和控制器的独立性和清晰的职责划分使得各个组件可以更容易地进行单元测试和集成测试。

适用场景: MVC架构适用于注重用户界面和交互的应用,对于游戏软件来说,如果用户界面和用户交互是核心要素,例如游戏界面、用户输入和游戏逻辑的交互,MVC架构可以提供良好的用户界面管理和交互控制。

注重数据持久化和数据访问层优化,三层架构

注重用户界面和交互控制,MVC架构

🧠综合题

请画出PureMVC完整架构图并详细分析

① 架构图

image-20230624113428865

② 什么是pureMVC架构:PureMVC是在基于模型、视图和控制器MVC模式建立的一个轻量级应用框架

③ 组成:Model、ProxyView、MediatorController、CommandFacade

④ 设计模式:单例模式、中介模式、代理模式、观察者模式

⑤ 作用:提供了一种结构清晰、职责明确的开发模式

⑥ 优点:清晰的架构设计、解耦和分离、可扩展性、可测试性

⑦ 缺点:高度依赖框架、过度设计

请画出MVC完整架构图并详细分析

① 架构图

image-20230624165600833

② 什么是MVC架构:一种常用的软件架构模式

③ 组成:Model、View、Controller

④ 设计模式:观察者模式、策略模式

⑤ 作用:分离关注点、提高可维护性、支持并发开发

⑥ 优点:分离关注点、可扩展性、可重用性、并行开发

⑦ 缺点:复杂性增加、耦合性

用单例模式设计用户数据类,用户数据类需要有金币的数量、增加金币、减少金币、显示金币的接口,并调用

User.java

java
package User;

/*
* 定义用户类
* */
public class User {
    // 单例模式,static所有User共享这个instance,即初始化一次都可以使用
    private static User instance;

    // 用户金币信息
    private int coins;

    // 私有构造函数,防止外部再次实例化
    private User() {
        coins = 0;
    }

    // 获取单例实例,只允许一个实例
    public static synchronized User getInstance(){
        // 单例模式,只初始化一次,即为null才初始化,否则直接返回
        if (instance == null) {
            instance = new User();
        }
        return instance;
    }

    // 获取金币数量
    public int getCoins() {
        return coins;
    }

    // 减少金币
    public void subCoins(int num){
        if (coins >= num) {
            coins -= num;
            System.out.println("减少金币成功");
        }
        else{
            System.out.println("金币数量不足");
        }
    }

    // 增加金币
    public void addCoins(int num){
        coins += num;
        System.out.println("增加成功");
    }

    // 设置金币数量
    public void setCoins(int num) {
        this.coins = num;
        System.out.println("金币设置成功");
    }

}

TestUser.java

java
package User;

public class TestUser {
    public static void main(String[] args) {
        // 不需要初始化,直接获得实例,初始化在类内部解决,保证只初始化一次
        User userdata = User.getInstance();

        // 设置金币并显示
        userdata.setCoins(8);
        System.out.println("当前金币为:"+userdata.getCoins());

        // 增加金币并显示
        userdata.addCoins(5);
        System.out.println("当前金币为:"+userdata.getCoins());

        // 减少金币并显示
        userdata.subCoins(7);
        System.out.println("当前金币为:"+userdata.getCoins());
    }
}

用观察者模式设计消息中心类,实现监听、移除监听、消息发送,并调用

MyObserver.java

java
package Observer;

/*
 * 定义抽象观察者
 * */
public interface MyObserver {
    // 数据更新
    void dataChange(String message);
}

MessageObserver.java

java
package Observer;

/*
 * 定义具体观察者
 * */
public class MessageObserver implements MyObserver{
    // 名字
    private String name;

    // 构造函数,初始化名字
    public MessageObserver(String name) {
        this.name = name;
    }

    // 数据更新
    public void dataChange(String message) {
        System.out.println(name + "收到消息:\n"+message);
    }
}

Subject.java

java
package Observer;

/*
* 定义抽象主题
* */
public interface Subject {
    // 注册观察者
    void registerObserver(MyObserver observer);

    // 移除观察者
    void removeObserver(MyObserver observer);

    // 通知观察者
    void notifyObservers(String message);
}

MessageCenter.java

java
package Observer;

/*
 * 定义具体主题
 * */
import java.util.ArrayList;
import java.util.List;

public class MessageCenter implements Subject{
    // 观察者队列
    private List<MyObserver> observers;

    // 构造函数,初始化观察者队列
    public MessageCenter(){
        observers = new ArrayList<MyObserver>();
    }

    // 添加观察者
    public void registerObserver(MyObserver observer) {
        observers.add(observer);
    }

    // 移除观察者
    public void removeObserver(MyObserver observer) {
        observers.remove(observer);
    }

    // 通知所有观察者
    public void notifyObservers(String message) {
        for (MyObserver observer : observers) {
            observer.dataChange(message);
        }
    }

    // 发送消息
    public void sendMessage(String message) {
        // 发送消息
        System.out.println("发送消息:" + message);
        // 将消息告诉给所有观察者
        notifyObservers(message);
    }
}

TestObserver.java

java
package Observer;

public class TestObserver {
    public static void main(String[] args) {
        // 创建消息中心
        MessageCenter messageCenter = new MessageCenter();

        // 创建观察者
        MessageObserver observer1 = new MessageObserver("Observer1");
        MessageObserver observer2 = new MessageObserver("Observer2");

        // 注册观察者
        messageCenter.registerObserver(observer1);
        messageCenter.registerObserver(observer2);

        // 发送消息
        messageCenter.sendMessage("Hello,observer");

        // 移除观察者
        messageCenter.removeObserver(observer2);

        // 发送消息
        messageCenter.sendMessage("Observer2 已移除");
    }
}

本文作者:Malyue

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!