软件体系结构与设计实验二——使用组合模式模拟层叠菜单

这篇博客介绍了如何利用组合模式(Composite Pattern)来实现层叠菜单的功能。在Java中,通过创建抽象构件MenuComponent作为基类,定义了添加、删除和打印菜单项的方法。树枝构建类Menu继承抽象类,实现子菜单的存储和管理,而叶子构建类MenuItem则代表具体的菜单项。在客户端代码中,创建了不同层级的菜单对象并进行测试,展示了组合模式在构建层次结构中的应用。
摘要由CSDN通过智能技术生成

一、问题描述

  层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单(如图1所示)中包括的可能是一个菜单项(直接对应某个功能),也可能是一个子菜单,现在组合组合(Composite)设计模式实现层叠菜单,得到如图2所示的类图。现采用组合模式编程模拟实现上述层叠菜单,实现菜单项(子菜单)的添加、删除和打印(本题根据软件设计师2021年上半年上午第5题(第6题)改编而成)。
在这里插入图片描述

在这里插入图片描述
要求:

  1. 使用C++、JAVA或C#语言编写,编程环境不限(如C++编写,可使用VC++2010学习版,安装包在“资料”的“安装包”文件夹中可以下载到,安装和使用教程请参见附录)。

  2. 在主函数中创建Menu和MenuItemr类对象并测试相关功能,测试数据可由使用者自己输入。

二、代码

代码一

抽象构件

package CompositePattern;

import java.util.List;

//抽象构件,定义参加组合对象的共有方法和属性
//用于访问和管理Component子部件,可以是抽象类或者接口
abstract class MenuComponent {
//菜单的添加、删除和打印操作
    private String name;//子菜单的名字
    //打印操作
    public abstract void printName();
    //添加子菜单的操作
    public void addMenuElement(MenuComponent element){
        throw new UnsupportedOperationException();
    };
    //删除子菜单操作
    public void removeMenuElement(MenuComponent element){
        throw new UnsupportedOperationException();
    };

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

树枝构建

package CompositePattern;

import java.util.ArrayList;
import java.util.List;

//非叶子节点,用于存储子部件,实现子部件中的相关操作  充当一个管理者
class Menu extends MenuComponent{

    //存放的是子菜单
    List<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
    //构造器
    public Menu(String name) {
        super(name);
    }

    //重写父类的add方法
    @Override
    public void addMenuElement(MenuComponent element) {
        menuComponents.add(element);
    }

    //重写父类的remove方法
    @Override
    public void removeMenuElement(MenuComponent element) {
        menuComponents.remove(element);
    }

    //重写父类的get方法
    @Override
    public String getName() {
        return super.getName();
    }

    //输出该菜单中包含的子菜单
    @Override
    public void printName() {
        System.out.println("-------" + getName() + "-------");
        for (MenuComponent menuComponents:menuComponents) {
            menuComponents.printName();
        }
    }
}

叶子构建

package CompositePattern;

import java.util.ArrayList;
import java.util.List;

//叶子节点 没有子节点
class MenuItem extends MenuComponent {

    @Override
    public void printName() {
        System.out.println(getName());
    }

    //构造器
    public MenuItem(String name) {
        super(name);
    }

    //不需要写add,remove方法
    //重写父类的get方法
    @Override
    public String getName() {
        return super.getName();
    }
}

客户

package CompositePattern;

public class Client {
    public static void main(String[] args) {
         //从大到小创建对象
        MenuComponent mainMenu =  new Menu("设计模式");
        MenuComponent subMenu =  new Menu("笔记代码");
        MenuComponent component1 = new MenuItem("第一次实验代码.txt");
        MenuComponent component2 = new MenuItem("第一次实验代码.txt");
        subMenu.addMenuElement(component1);
        subMenu.addMenuElement(component2);
        mainMenu.printName();
        subMenu.printName();

    }
}

运行结果:
在这里插入图片描述

代码二

抽象构件

package work;


public abstract class MenuComponent {
	private String name;

	public MenuComponent(String name) {
		super();
		this.name = name;
	}
	
	public String getName() {
		return name;
	}


	public abstract void add(MenuComponent m);
	public abstract void remove(MenuComponent m);
	public abstract void print();
	
	
}

树枝构建

package work;

import java.util.ArrayList;
import java.util.List;

public class MenuItem extends MenuComponent {

	List<MenuComponent> list = new ArrayList<MenuComponent>();

	public MenuItem(String name) {
		super(name);
	}

	@Override
	public void add(MenuComponent m) {
		list.add(m);

	}

	@Override
	public void remove(MenuComponent m) {
		list.remove(m);
	}

	@Override
	public void print() {
		System.out.println("\t"+getName());
		for (MenuComponent menuComponent : list) {
			menuComponent.print();
		}
	}

}

叶子构建

package work;

public class Menu extends MenuComponent{

	public Menu(String name) {
		super(name);
	}

	
	@Override
	public String getName() {
		return super.getName();
	}
	@Override
	public void add(MenuComponent m) {
		System.out.println("不能添加");
		
	}

	@Override
	public void remove(MenuComponent m) {
		System.out.println("不能删除");
		
	}

	@Override
	public void print() {
		System.out.println("\t"+"\t"+getName());
		
	}

}

主菜单

package work;

import java.util.ArrayList;
import java.util.List;

public class MainMenu extends MenuComponent{

	public MainMenu(String name) {
		super(name);
	}
	List<MenuComponent> list = new ArrayList<MenuComponent>();


	@Override
	public void add(MenuComponent m) {
		list.add(m);

	}

	@Override
	public void remove(MenuComponent m) {
		list.remove(m);
	}

	@Override
	public void print() {
		System.out.println(getName());
		for (MenuComponent menuComponent : list) {
			menuComponent.print();
		}
	}

}

客户端

package work;

public class Test {
	public static void main(String[] args) {
		MenuComponent mc = new 	MainMenu("设置");
		MenuComponent mc1 = new Menu("文件");
		MenuComponent mc2 = new MenuItem("文件夹1");
		MenuComponent mc3 = new MenuItem("文件夹2");
		mc.add(mc1);
		mc2.add(new MenuItem("文件夹1-1"));
		mc2.add(new MenuItem("文件夹1-2"));
		mc2.add(new Menu("文件1-1"));
		mc.remove(mc1);
		mc.add(mc2);
		mc.print();
		
	}
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值