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

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();
    }
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白夜的月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值