Go和Java实现组合模式

这篇具有很好参考价值的文章主要介绍了Go和Java实现组合模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go和Java实现组合模式

我们通过部门和员工的层次结构的示例来演示组合模式的用法。

1、组合模式

组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对

象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

  • 意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用

    具有一致性。

  • 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一

    样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

  • 何时使用:1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的

    不同,用户将统一地使用组合结构中的所有对象。

  • 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

  • 关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

  • 应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作

    符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

  • 优点:1、高层模块调用简单。 2、节点自由增加。

  • 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

  • 使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

  • 注意事项:定义时为具体类。

  • 适用性:

    你想表示对象的部分-整体层次结构。

    你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。文章来源地址https://www.toymoban.com/news/detail-629705.html

2、Go实现组合模式

package composite

// ==========Employer(员工)==========
type Employer interface {
	// 新增员工
	Add(Employer)
	// 删除员工
	Delete(Employer)
	// 打印员工信息
	PrintInfo()
}
package composite

import "fmt"

// ==========ProjectManager(项目经理)==========
type ProjectManager struct {
	Name      string
	Employers []Employer
}

// 新增员工
func (projectManager *ProjectManager) Add(employer Employer) {
	projectManager.Employers = append(projectManager.Employers, employer)
}

// 删除员工
func (projectManager *ProjectManager) Delete(employer Employer) {
	for i := 0; i < len(projectManager.Employers); i++ {
		if projectManager.Employers[i] == employer {
			projectManager.Employers = append(projectManager.Employers[:i], projectManager.Employers[i+1:]...)
		}
	}
}

// 打印员工信息
func (projectManager *ProjectManager) PrintInfo() {
	// 可以打印项目助理和程序员的信息
	fmt.Println("ProjectManager PrintInfo:")
	for _, employer := range projectManager.Employers {
		switch emp := employer.(type) {
		case *Programmer:
			fmt.Println("Programmer:", emp.Name)
		case *ProjectAssistant:
			fmt.Println("ProjectAssistant:", emp.Name)
		}
	}
}
package composite

import "fmt"

// ==========ProjectAssistant(项目助理)==========
type ProjectAssistant struct {
	Name      string
	Employers []Employer
}

// 新增员工
func (projectAssistant *ProjectAssistant) Add(employer Employer) {
	projectAssistant.Employers = append(projectAssistant.Employers, employer)
}

// 删除员工
func (projectAssistant *ProjectAssistant) Delete(employer Employer) {
	for i := 0; i < len(projectAssistant.Employers); i++ {
		if projectAssistant.Employers[i] == employer {
			projectAssistant.Employers = append(projectAssistant.Employers[:i], projectAssistant.Employers[i+1:]...)
		}
	}
}

// 打印员工信息
func (projectAssistant *ProjectAssistant) PrintInfo() {
	// 可以打印程序员的信息
	fmt.Println("ProjectAssistant PrintInfo:")
	for _, employer := range projectAssistant.Employers {
		switch emp := employer.(type) {
		case *Programmer:
			fmt.Println("Programmer:", emp.Name)
		}
	}
}
package composite

// ==========Programmer(程序员)==========
type Programmer struct {
	Name      string
	Employers []Employer
}

// 新增员工
func (programmer *Programmer) Add(employer Employer) {
}

// 删除员工
func (programmer *Programmer) Delete(employer Employer) {
}

// 打印员工信息
func (programmer *Programmer) PrintInfo() {
}
package main

import (
	. "proj/composite"
)

func main() {

	// ==========项目经理==========
	cpm := ProjectManager{Name: "项目经理"}
	// ==========项目助理==========
	cpa := &ProjectAssistant{Name: "项目助理"}
	// ==========程序员一==========
	cp1 := &Programmer{Name: "程序员一"}
	// ==========程序员二==========
	cp2 := &Programmer{Name: "程序员二"}

	// 项目经理添加项目助理
	cpm.Add(cpa)
	// 项目经理添加程序员
	cpm.Add(cp1)
	cpm.Add(cp2)
	cpm.PrintInfo()
	// 删除程序员二
	cpm.Delete(cp2)
	cpm.PrintInfo()
}
# 输出
ProjectManager PrintInfo:
ProjectAssistant: 项目助理
Programmer: 程序员一
Programmer: 程序员二
ProjectManager PrintInfo:
ProjectAssistant: 项目助理
Programmer: 程序员一

3、Java实现组合模式

package com.composite;

import java.util.List;

// ==========Employer(员工)==========
public abstract class Employer {

    public String name;

    public List<Employer> employers;

    public String getName() {
        return name;
    }

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

    public List<Employer> getEmployers() {
        return employers;
    }

    public void setEmployers(List<Employer> employers) {
        this.employers = employers;
    }

    // 新增员工
    public void add(Employer employer) {
        employers.add(employer);
    }

    // 删除员工
    public void delete(Employer employer) {
        employers.remove(employer);
    }

    // 打印员工信息
    public abstract void printInfo();

}
package com.composite;

import java.util.ArrayList;

// ==========ProjectManager(项目经理)==========
public class ProjectManager extends Employer  {

    public ProjectManager(String name) {
        setName(name);
        employers = new ArrayList<>();
    }

    // 打印员工信息
    @Override
    public void printInfo() {
        // 可以打印项目助理和程序员的信息
        System.out.println("ProjectManager PrintInfo:");
        for(Employer employer :employers){
            if (employer instanceof ProjectAssistant){
                System.out.println("ProjectAssistant:" + employer.getName());
            }else if (employer instanceof Programmer){
                System.out.println("Programmer:" + employer.getName());
            }
        }
    }
}
package com.composite;

import java.util.ArrayList;

// ==========ProjectAssistant(项目助理)==========
public class ProjectAssistant  extends Employer{

    public ProjectAssistant(String name) {
        setName(name);
        //项目助理,表示没有下属了
        employers = new ArrayList<>();
    }

    // 打印员工信息
    @Override
    public void printInfo() {
        // 可以打印程序员的信息
        System.out.println("ProjectAssistant PrintInfo:");
        for(Employer employer:employers){
            if (employer instanceof Programmer){
                System.out.println("Programmer:" + employer.getName());
            }
        }
    }
}
package com.composite;

// ==========Programmer(程序员)==========
public class Programmer extends Employer  {

    public Programmer(String name) {
        setName(name);
        //程序员,,表示没有下属了
        employers = null;
    }

    // 新增员工
    @Override
    public void add(Employer employer) {
    }

    // 删除员工
    @Override
    public void delete(Employer employer) {
    }

    // 打印员工信息
    @Override
    public void printInfo() {

    }
}
package com.composite;

public class Test {

    public static void main(String[] args) {
        // ==========项目经理==========
        Employer pm = new ProjectManager("项目经理");
        // ==========项目助理==========
        Employer pa = new ProjectAssistant("项目助理");
        // ==========程序员一==========
        Employer programmer1 = new Programmer("程序员一");
        // ==========程序员二==========
        Employer programmer2 = new Programmer("程序员二");
        // 项目经理添加项目助理
        pm.add(pa);
        // 项目经理添加程序员
        pm.add(programmer1);
        pm.add(programmer2);
        pm.printInfo();
        // 删除程序员二
        pm.delete(programmer2);
        pm.printInfo();
    }
}
# 输出
ProjectManager PrintInfo:
ProjectAssistant:项目助理
Programmer:程序员一
Programmer:程序员二
ProjectManager PrintInfo:
ProjectAssistant:项目助理
Programmer:程序员一

到了这里,关于Go和Java实现组合模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java23种设计模式-结构型模式之组合模式

    组合模式 (Composite Pattern):将 对象组合成树状结构 以表示“ 部分-整体 ”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。 通常包含以下几个角色: 角色1. 抽象组件 (Component):声明了 组

    2024年04月26日
    浏览(40)
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现

    单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。 当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式

    2023年04月27日
    浏览(90)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(81)
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源

    2023年04月25日
    浏览(84)
  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。 当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅

    2024年02月01日
    浏览(44)
  • 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。 迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等

    2023年04月17日
    浏览(47)
  • 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    享元模式(Flyweight Pattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 当程序需要生成数量巨大的相似

    2023年04月10日
    浏览(38)
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法

    2024年02月01日
    浏览(83)
  • 【解释器设计模式详解】C/Java/Go/JS/TS/Python不同语言实现

    解释器模式(Interpreter Pattern)是一种行为型设计模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式常被用在 SQL 解析、符号处理引擎等。 解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的

    2023年04月12日
    浏览(231)
  • 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    备忘录模式(Memento Pattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 备忘录模式

    2023年04月20日
    浏览(74)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包