设计模式期末程序题(只是一个简单整理)

news2025/1/19 11:26:49

1.下图是某系统的数据部分的类图。因为该层次结构中的操作需要经常变化,所以需要用访问者模式对其进行重构,请按以下要求完成题目:
(1)绘制重构后系统完整类图。(4分)
(2)给出重构后ElementA类的代码。(4分)
(3)在客户端运用访问者模式,对ElementA的实例,完成CalPrice操作。(2分)

package 题库.访问者模式;

// 元素抽象类
public abstract class Element {
public abstract void accept(Visitor v);
}

// 具体元素类A
public class ElementA extends Element {
public void accept(Visitor v) {
v.visit(this);
}
}

// 具体元素类B
public class ElementB extends Element {
public void accept(Visitor v) {
v.visit(this);
}
}

// 访问者抽象类
public abstract class Visitor {
public abstract void visit(ElementA element);
public abstract void visit(ElementB element);
}

// 具体访问者类
public class CalPriceVistor extends Visitor {
public void visit(ElementA element) {
// 访问元素A,并执行相关业务逻辑
}

public void visit(ElementB element) {
// 访问元素B,并执行相关业务逻辑
}
}

// 客户端
public class Client {
public static void main(String[] args) {
Visitor v = new CalPriceVistor();
ElementA a = new ElementA();
ElementB b = new ElementB();
a.accept(v);
b.accept(v);
}
}
  1. 给定如图所示的树形结构,请应用组合模式,在客户端完成数据的展示。具体要求如下:
    1)绘制组合模式的类图。(4分)
    2)编写简单元素和复杂元素的代码。(4分)
    3)在客户端构造出树形数据并输出。(4分)
    在这里插入图片描述

提示:程序运行后,输出信息应为

Root
Leaf A
Comp B
Leaf BX
Leaf BY
Leaf C

//节点接口
interface Component {
    void display();
    void add(Component c);
    void remove(Component c);
}
//叶子节点
class Leaf implements Component {
    String name;

    public Leaf(String name) {
        this.name = name;
    }

    public void display() {
        System.out.println(name);
    }

    public void add(Component c) {
        // Leaf节点无法添加子节点,不做处理
    }

    public void remove(Component c) {
        // Leaf节点无法移除子节点,不做处理
    }
}
//父母节点
class Composite implements Component {
    String name;
    ArrayList<Component> list = new ArrayList<Component>();

    public Composite(String name) {
        this.name = name;
    }

    public void display() {
        System.out.println(name);
        for (int i = 0; i < list.size(); i++) {
            list.get(i).display();
        }
    }

    public void add(Component c) {
        list.add(c);
    }

    public void remove(Component c) {
        list.remove(c);
    }
}

public class Test {
    public static void main(String[] args) {
        Component root = new Composite("Root");
        root.add(new Leaf("Leaf A"));
        Component comp = new Composite("Comp B");
        root.add(comp);
        comp.add(new Leaf("Leaf BX"));
        comp.add(new Leaf("Leaf BY"));
        root.add(new Leaf("Leaf C"));
        root.display();
    }
}
  1. 现在需要开发一款游戏软件,请以单例模式来设计其中的Boss角色。角色的属性和动作可以任意设计。 要求:该Boss类可以在多线程中使用。(8分)
package 题库;

/**
 * @Description: 单例模式
 * @ClassName: Boss
 * @Author: weisn
 * @Date: 2023/5/22 20:24
 * @Version: 1.0
 */
public class Boss {
    private static Boss instance;

    private Boss() {}

    //synchronized(Boss.class) 表示 Boss 类的 class 对象作为锁对象,用于使用同步代码块。
    // 当线程获取到该锁对象时,才能够执行被锁定的代码块。
    //在单例模式中,由于只有一个实例存在,我们需要保证在多线程情况下获取该实例的过程中,不能创建多个对象。
    // 因此,在getInstance()方法中需要使用同步代码块来进行线程同步,使用双重检查(lock with double check)保证线程安全,
    // 这里的 synchronized(Boss.class) 就是保证线程安全的关键。
    public static Boss getInstance() {
        if (instance == null) {
            synchronized(Boss.class) {
                if (instance == null) {
                    instance = new Boss();
                }
            }
        }
        return instance;
    }

    public void attack() {
        System.out.println("The boss is attacking!");
    }

    public void defend() {
        System.out.println("The boss is defending!");
    }

    public void specialAttack() {
        System.out.println("The boss is using a special attack!");
    }

    // 再添加几个属性和方法用于示例
    private int health = 100;
    private int damage = 10;
    private int defense = 5;

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getDamage() {
        return damage;
    }

    public void setDamage(int damage) {
        this.damage = damage;
    }

    public int getDefense() {
        return defense;
    }

    public void setDefense(int defense) {
        this.defense = defense;
    }
}
  1. 一个农场公司,专门负责培育各种水果,有葡萄,草莓和苹果,请使用工厂方法,编写工厂类和主程序,并在主程序中来完成草莓生长状态的描述。(8分)—工厂模式
    在这里插入图片描述

package 题库.水果工厂;

/**
 * @Description: 抽象工厂类
 * @ClassName: Fruit
 * @Author: weisn
 * @Date: 2023/5/22 20:38
 * @Version: 1.0
 */
public abstract class Fruit {
    // 种植
    public abstract void plant();
    // 生长
    public abstract void grow();
    // 收获
    public abstract void harvest();
}
package 题库.水果工厂;

public class Apple extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植苹果树");
    }

    @Override
    public void grow() {
        System.out.println("苹果正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获苹果");
    }
}

```java
package 题库.水果工厂;

public class Grape extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植葡萄树");
    }

    @Override
    public void grow() {
        System.out.println("葡萄正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获葡萄");
    }
}

```java
package 题库.水果工厂;

public class Strawberry extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植草莓");
    }

    @Override
    public void grow() {
        System.out.println("草莓正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获草莓");
    }
}
package 题库.水果工厂;

public interface Factory {
    Fruit build();
}package 题库.水果工厂;

public class AppleFactory implements Factory {
    public Fruit build() {
        return new Apple();
    }
}
package 题库.水果工厂;

public class GrapeFactory implements Factory {
    public Fruit build() {
        return new Grape();
    }
}
package 题库.水果工厂;

public class StrawberryFactory implements Factory {
    public Fruit build() {
        return new Strawberry();
    }
}
package 题库.水果工厂;

public class MainUI {
    public static void main(String[] args) {
        Factory fac = new StrawberryFactory();
        Fruit ft = fac.build();
        ft.plant();
        ft.grow();
        ft.harvest();
    }
}

5.第四题用简单工厂模式实现:

package 题库.水果简单工厂;

public abstract class Fruit {
    public abstract void plant();
    public abstract void grow();
    public abstract void harvest();
}
package 题库.水果简单工厂;

public class Apple extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植苹果树");
    }

    @Override
    public void grow() {
        System.out.println("苹果正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获苹果");
    }
}
package 题库.水果简单工厂;

public class Grape extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植葡萄树");
    }

    @Override
    public void grow() {
        System.out.println("葡萄正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获葡萄");
    }
}
package 题库.水果简单工厂;

public class Strawberry extends Fruit {
    @Override
    public void plant() {
        System.out.println("种植草莓");
    }

    @Override
    public void grow() {
        System.out.println("草莓正在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获草莓");
    }
}
package 题库.水果简单工厂;

public class FruitFactory {
    public static Fruit createFruit(String type) {
        Fruit ft = null;
        if (type.equals("Apple")) {
            ft = new Apple();
        } else if (type.equals("Grape")) {
            ft = new Grape();
        } else if (type.equals("Strawberry")) {
            ft = new Strawberry();
        }
        return ft;
    }
}
package 题库.水果简单工厂;

public class MainUI {
    public static void main(String[] args) {
        Fruit ft = FruitFactory.createFruit("Apple");
        ft.plant();
        ft.grow();
        ft.harvest();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一章 数学基础

目录 一、线性代数二、微积分三、概率 一、线性代数 理解范数概念区分向量的内积 a ⋅ b \mathbf{a} \cdot \mathbf{b} a⋅b 与外积 a b \mathbf{a} \times \mathbf{b} ab区分矩阵的乘法 A ⊗ B \mathbf{A} \otimes \mathbf{B} A⊗B、内积 A B \mathbf{A} \mathbf{B} AB 、…

通过Python的PyPDF2库提取pdf中的图片

文章目录 前言一、PyPDF2库是什么&#xff1f;二、安装PyPDF2库三、查看PyPDF2库版本四、使用方法待提取的pdf截图1.引入库2.定义pdf路径3.打开PDF文件4.创建PDF阅读器对象5.获取PDF文件中的页数6.遍历每一页进行处理7.提取出来的图片 总结 前言 大家好&#xff0c;我是空空sta…

【Linux初阶】进程程序替换 | 初识、原理、函数、应用 makefile工具的多文件编译

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;替换初识&#xff0c;替换原理&#xff0c;替换函数理解和使用&#xff0c;makefile工具的多文件编译&#xf…

C++(4):表达式

表达式由一个或多个运算对象(operand)组成,对表达式求值将得到一个结果(result&#xff09;。字面值和变量是最简单的表达式&#xff08;expression)&#xff0c;其结果就是字面值和变量的值。把一个运算符&#xff08;operator)和一个或多个运算对象组合起来可以生成较复杂的表…

倒挂的解决方案你现在是一位计算机专家,来聊一聊:“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事”

目录 倒挂的解决方案 你现在是一位计算机专家&#xff0c;来聊一聊&#xff1a;“美国的火星探测器Mars Path-finder 就是因为优先级倒挂而出现故障的故事” ●使用中断禁止 具体证明请参阅Liu和Kayland于1973年发表的论文。 ● 因时序或外部中断或进程挂起而导致操作系统获…

数据结构-关键路径-理论

1.AOE-网 与AOV-网相对应的是AOE-网&#xff08;Activity On Netword&#xff09;&#xff0c;即以边表示活动的网。AOE-网是带权的有向无环图&#xff0c;其中&#xff0c;定点表示时间&#xff0c;弧表示活动&#xff0c;权表示活动持续的时间。通常AOE-网可用来估算工程的完…

Base64字符串从前台传到后台以后,“+”加号消失

记录一下问题&#xff1a; 使用 encodeURI(str) 对字符串进行加密的时候&#xff0c;后端解密会丢失 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&…

第一章.机器学习的基础概念

第一章.机器学习的基础概念 1.1 机器学习的基础概念 1.机器学的概念&#xff1a; 机器学习就是机器从数据中总结经验。从数据中找出某种规律或者模型&#xff0c;并用他来解决某种实际问题。 2.机器学习的应用场景 1).事物本身存在某种潜在规律 2).某些问题难以使用普通编程…

two-stage目标检测算法

R-CNN 现在&#xff0c;将目光穿越回2012年&#xff0c;hinton刚刚提出alexnet的时代。 此时&#xff0c;该如何审视目标检测任务&#xff1f; 当时的目标检测采用的是滑动窗口手动特征分类器的思路。 该方法的弱点包括 速度慢 精度差 精度差的问题是由手工特征造成的&am…

【VS安装记录】Visual Studio 2022安装教程(超详细)

大家好&#xff0c;我是雷工&#xff01; 由于更换了电脑&#xff0c;很多软件需要重新安装&#xff0c;为了方便学习C#&#xff0c;今天有时间安装下Visual Studio 2022&#xff0c;顺便记录安装过程。 1、从官网下载并解压软件压缩包&#xff0c;然后打开文件夹。 2、双击…

切比雪夫不等式,大数定律及极限定理。

一.切比雪夫不等式 1.定理 若随机变量X的期望EX和方差DX存在,则对任意ε > 0,有   P{ |X - EX| > ε } < DX/ε2 或 P{ |X - EX| < ε } > 1 - DX/ε2 2.解析定理 ①该定理对 X 服从什么分布不做要求&#xff0c;仅EX DX存在即可。 ②“| |” 由于X某次…

linux kernel pwn 基础知识

基础知识 内核概述 内核架构 通常来说我们可以把内核架构分为两种&#xff1a;宏内核和微内核&#xff0c;现在还有一种内核是混合了宏内核与微内核的特性&#xff0c;称为混合内核。 宏内核&#xff08;Monolithic kernel&#xff09;&#xff0c;也译为集成式内核、单体…

网络原理——基础概念(端口号、分层、封装和复用)、各层协议(TCP/IP协议)(详细图解)

目录 一、基础概念 1、 IP地址 &#xff08;1&#xff09;点分十进制 2、端口号 3、协议 &#xff08;1&#xff09;协议的 组成部分 &#xff08;2&#xff09; 协议的 作用 4、五元组 5、协议分层 &#xff08;1&#xff09;分层的 好处 &#xff08;2&#xff0…

Overleaf中Latex问题——控制文本分两列显示(分栏布局)

文章目录 需求描述相关介绍实现代码实现效果参考和总结 需求描述 要写论文&#xff0c;需要分两列进行显示文本。但是默认都是单列展示&#xff0c;并且自动换行。 需要实现一下的效果 相关介绍 在$LaTeX 中&#xff0c;你可以使用 中&#xff0c;你可以使用 中&#xff0c…

Tokenview上线BRC-20浏览器,支持Ordinals API数据服务

5月20日&#xff0c;Tokenview团队宣布正式推出BRC-20代币浏览器&#xff0c;同时支持BTC Ordinals API数据服务。作为通用多链区块链浏览器&#xff0c;Tokenview以最快的速度推出了BRC-20浏览器&#xff0c;Ordinals API旨在为所有面向比特币的普通用户和开发者提供数据支持&…

追寻篮球梦想 点燃希望之光 2023年海彼特全国幼儿篮球联赛·总决赛圆满落幕

5月21日&#xff0c;由北京海彼特教育科技院主办的“2023年海彼特全国幼儿篮球联赛总决赛”。在河北体育馆隆重举行&#xff0c;精彩的比赛效果使体育馆顿时成为幼儿篮球界最高端、大气的舞台。 本次盛会联合举办方有&#xff1a; 河北体育馆 亚洲少儿体育协会 北京海彼特文…

组件123456789

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

G企孵化-千趣生活项目,10年互联网经验专业策划商业模式

G企孵化-千趣生活项目&#xff0c;10年互联网经验专业策划商业模式 背景&#xff1a;现在许许多多的项目&#xff0c;首先对外呼吁的口号就是“上市”但真正能做到上市的企业&#xff0c;确实没有几个&#xff0c;10年互联网经验的微三云胡佳东&#xff0c;给大家详细聊聊&…

【卡尔曼滤波的学习,以及一些理解】

卡尔曼滤波的一些理解 优秀的博客推荐直观理解卡尔曼滤波核心算法举个例子 最近两个多月在实习&#xff0c;做的是GPS定位相关的一些工作&#xff0c;同时也简单做了一下组合导航。卡尔曼滤波是组合不同传感器比较核心的算法&#xff0c;应用也比较广泛&#xff0c;也有很多文章…

电子数据保全及数据恢复

目录 一.创建虚拟磁盘 系统操作 1.创建虚拟磁盘文件 2.完成低级格式化——分区——高级格式化 3.虚拟磁盘创建完成 用winhex做 2. 镜像&#xff1a; 克隆&#xff1a; 计算分区的hash值&#xff1a; 二.FAT32文件系统 1.认识FAT32文件系统 三.NTFS文件系统 认识NTFS文…