Java设计模式之结构型-组合模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之结构型-组合模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

4.1、基本实现

4.2、菜单遍历 

五、总结 


一、基础概念

组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。

二、UML类图

Java设计模式之结构型-组合模式(UML类图+案例分析),Java,设计模式,java,设计模式,组合模式

三、角色设计

角色 描述
抽象构件角色 定义参与组合对象的共有方法和属性,可以是接口或抽象类
叶构件角色 基本构件类,无子构件,实现抽象构件角色所定义的接口
容器构件角色 存储子构件,实现子构件的相关操作,定义子构件的添加、删除等方法
客户端 通过抽象组件操作组合部件的对象

四、案例分析

4.1、基本实现

抽象构件:

public abstract class Component {

  public void addComponent(Component component){

  }

  public void remove(Component component){

  }

  public Component getComponent(int i){
    return null;
  }

  public abstract void operation();

}

叶子构件:

public class Leaf extends Component{

    @Override
    public void operation() {

    }

}

容器构件:

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

public class Composite extends Component{

    private List<Component> componentList = new ArrayList<>();

    @Override
    public void addComponent(Component component) {
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        componentList.remove(component);
    }

    @Override
    public Component getComponent(int i) {
        return componentList.get(i);
    }

    @Override
    public void operation() {
        for(Component component : componentList){
            component.operation();
        }
    }

}

客户端:

public class Client {

    public static void main(String[] args) {

        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();

        Composite composite1 = new Composite();
        composite1.addComponent(leaf1);
        composite1.addComponent(leaf2);

        Component leaf3 = new Leaf();
        Component leaf4 = new Leaf();

        Composite composite2 = new Composite();
        composite2.addComponent(leaf3);
        composite2.addComponent(leaf4);
        composite2.addComponent(composite1);

        composite2.operation();
    }
}

创建了两个叶节点leaf1和leaf2,一个复合组件composite1,组合包含leaf1和leaf2。

创建了两个叶节点leaf3和leaf4,一个复合组件composite2,组合包含leaf3、leaf4以及复合组件composite1。

调用composite2的operation方法,会遍历其下的所有子组件并调用其operation方法。

综上,这段基础代码演示了通过组合模式将对象组合成树状层次结构,通过调用根节点操作使得递归调用所有子节点的操作,实现统一处理个别对象和组合对象的情形,以达到“合成复用原则”。

4.2、菜单遍历 

我们平时用到的管理系统肯定会有1级菜单,2级菜单,3级菜单甚至4级菜单等等,下面就举一个更形象的例子来实现遍历菜单的功能。

菜单组件:

public abstract class MenuComponent {
  //菜单名
  protected String menuName;

  //菜单层级
  protected int level;

  //添加子菜单
  public void addMenu(MenuComponent menuComponent){}

  //移除子菜单
  public void removeMenu(MenuComponent menuComponent){}

  //获取指定的子菜单
  public MenuComponent getChildMenu(int index){
    return null;
  }

  //获取菜单名称
  public String getMenuName(){
    return menuName;
  }

  //打印菜单名称(子菜单或菜单项)
  public abstract void printMenu();
}

菜单:

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

public class Menu extends MenuComponent{

    //存储菜单或者菜单项
    private List<MenuComponent> menuComponentList = new ArrayList<>();

    public Menu(String menuName,int level){
        this.menuName = menuName;
        this.level = level;
    }

    @Override
    public void addMenu(MenuComponent menuComponent) {
        menuComponentList.add(menuComponent);
    }

    @Override
    public void removeMenu(MenuComponent menuComponent) {
        menuComponentList.remove(menuComponent);
    }

    @Override
    public MenuComponent getChildMenu(int index) {
        return menuComponentList.get(index);
    }

    @Override
    public void printMenu() {
        //打印菜单名称
        for (int i=0;i<level;i++){
            System.out.print("-");
        }
        System.out.println(menuName);
        for (MenuComponent component:menuComponentList){
            component.printMenu();
        }
    }

}

菜单项:

public class MenuItem extends MenuComponent{

    public MenuItem(String menuName,int level){
        this.menuName = menuName;
        this.level = level;
    }

    @Override
    public void printMenu() {
        for (int i=0;i<level;i++){
            System.out.print("-");
        }
        System.out.println(menuName);
    }
}

客户端:

public class Client{

    public static void main(String[] args) {
        //创建根目录
        MenuComponent menuComponent = new Menu("系统管理",1);
        //添加2个子菜单项
        menuComponent.addMenu(new MenuItem("老师管理",2));
        MenuComponent menu2 = new Menu("学生管理",2);
        //创建2级目录
        menu2.addMenu(new MenuItem("新增学生",3));
        menu2.addMenu(new Menu("修改学生",3));
        menu2.addMenu(new MenuItem("修改学生",3));
        menu2.addMenu(new Menu("删除学生",3));
        menuComponent.addMenu(menu2);
        menuComponent.printMenu();
    }

}

运行结果如下:

Java设计模式之结构型-组合模式(UML类图+案例分析),Java,设计模式,java,设计模式,组合模式

五、总结 

优点:

1、定义类层次结构更清晰,提高复用性。

2、简化客户端代码,统一对待单个对象和组合对象。

3、更容易在组合对象上新增功能。

缺点:

1、设计较复杂,增加系统实现难度。

2、不容易限制容器构件中的构件。

应用场景:

1、操作的对象具有递归树形结构时。

2、需要统一对待单个对象和组合对象时。

符合的设计原则:

1、组合复用原则(Composite Reuse Principle)

组合模式是组合复用原则最典型的体现,它通过组合方式实现对对象的复用。

2、开闭原则(Open Close Principle)

组合模式对扩展开放,可以通过添加新的叶节点或容器实现扩展,而无需修改原有代码。

3、单一职责原则(Single Responsibility Principle)

组合模式中各部分职责明确,容器构件用于存储组件,叶构件用于基本行为。

4、里氏替换原则(Liskov Substitution Principle)

组合模式确保所有构件遵循统一接口约定,父对象能被子对象替换。

5、依赖倒转原则(Dependence Inversion Principle)

组合模式依据抽象类而不是具体类进行组合,符合依赖倒转原则。

组合模式通过将对象组织成树形结构,模拟出复杂对象的结构关系,然后统一处理个别对象和组合对象,它充分利用了递归和层次性的对象模型来模拟复杂对象,但增加了系统的复杂性。应根据需要权衡使用,不能滥用。

综上,组合模式通过递归组合实现统一管理复杂对象,但会增加系统复杂度,需要谨慎使用。文章来源地址https://www.toymoban.com/news/detail-563103.html

到了这里,关于Java设计模式之结构型-组合模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【地铁上的设计模式】--结构型模式:组合模式

    什么是组合模式 组合模式是一种结构型设计模式,将对象组合成树形结构,以表示部分整体的层次结构,让用户对单个对象和组合对象的使用具有一致性。 在组合模式中,抽象构件定义了一个统一的接口,用于管理所有对象,叶子节点和组合节点都实现了该接口。叶子节点

    2024年02月02日
    浏览(41)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(49)
  • Java学习——设计模式——结构型模式2

    结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。 包括: 1、适配器 2、桥接 3、组合 4、装

    2024年02月03日
    浏览(46)
  • 【Java 设计模式】结构型之桥接模式

    桥接模式(Bridge Pattern)是一种结构型设计模式, 它将抽象部分与实现部分分离,使它们可以独立变化,从而降低它们之间的耦合 。桥接模式通过将抽象部分和实现部分分离,使得它们可以独立地变化,同时在它们之间建立一个桥梁。在本文中,我们将介绍 Java 中桥接模式的

    2024年01月19日
    浏览(46)
  • 【Java 设计模式】结构型之外观模式

    外观模式(Facade Pattern)是一种结构型设计模式, 它为复杂系统提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统 。外观模式通过创建一个包装类(外观类),将系统的复杂性封装起来,对客户端提供一个简单的接口。在本文中,我们将深入研究Ja

    2024年01月21日
    浏览(45)
  • 【十】设计模式~~~结构型模式~~~享元模式(Java)

    【学习难度:★★★★☆,使用频率:★☆☆☆☆】         面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。 享元模式正是为解决这一类问题

    2024年02月08日
    浏览(50)
  • Java设计模式-结构型-适配器模式

    ​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用

    2024年02月20日
    浏览(57)
  • 【Java 设计模式】结构型之适配器模式

    适配器模式(Adapter Pattern)是一种结构型设计模式, 用于将一个类的接口转换成客户端期望的另一个接口 。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。在本文中,我们将介绍 Java 中适配器模式的定义、结构、使用场景以及如何在实际开发中应用。

    2024年01月19日
    浏览(46)
  • 【Java 设计模式】结构型之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量以节省内存和提高性能。享元模式通过共享大量相似对象的状态,使得这些对象可以共享,而不需要在每个对象中都存储相同的数据。在本文中,我们将深入研究Java中享元模式的定义、结构、使用场景

    2024年01月22日
    浏览(53)
  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包