首页 > 其他分享 >组合模式

组合模式

时间:2022-09-27 15:36:49浏览次数:39  
标签:func 组合 模式 job jobber addSubordinate subordinate string

组合模式

职务接口

package composite

type jobber interface {
	setJob(string)
	setManager(jobber)
	addSubordinate(jobber)
	print(string)
}

职务节点

package composite

type worker struct {
	job     string
	manager jobber
}

func (w *worker) setJob(job string) {
	w.job = job
}

func (w *worker) setManager(mgr jobber) {
	w.manager = mgr
}

func (w *worker) addSubordinate(subordinate jobber) {}

func (w *worker) Print(str string) {}

管理职务

package composite

import "fmt"

type composite struct {
	worker
	subordinate []jobber
}

func NewComposite(job string) jobber {
	m := new(composite)
	m.job = job
	m.subordinate = make([]jobber, 0)
	return m
}

func (c *composite) addSubordinate(subordinate jobber) {
	subordinate.setManager(c)
	c.subordinate = append(c.subordinate, subordinate)
}

func (c *composite) print(str string) {
	fmt.Printf("%s %s\n", str, c.job)
	str += "--"
	for _, v := range c.subordinate {
		v.print(str)
	}
}

一般职务

package composite

import "fmt"

type leaf struct {
	worker
}

func NewLeaf(job string) jobber {
	l := new(leaf)
	l.job = job
	return l
}

func (l *leaf) print(str string) {
	fmt.Printf("%s %s\n", str, l.job)
}

测试文件

package composite

import "testing"

func TestNewComposite(t *testing.T) {
	m1 := NewComposite("总经理")
	m2 := NewLeaf("秘书")
	m3 := NewComposite("财务经理")
	m4 := NewLeaf("会计")
	m5 := NewLeaf("出纳")
	m6 := NewComposite("研发经理")
	m7 := NewComposite("前端经理")
	m8 := NewLeaf("美工")
	m9 := NewComposite("后端经理")
	m10 := NewLeaf("程序员")

	m1.addSubordinate(m2)
	m1.addSubordinate(m3)
	m1.addSubordinate(m6)
	m3.addSubordinate(m4)
	m3.addSubordinate(m5)
	m6.addSubordinate(m7)
	m6.addSubordinate(m9)
	m7.addSubordinate(m8)
	m9.addSubordinate(m10)

	m1.print("")
}

标签:func,组合,模式,job,jobber,addSubordinate,subordinate,string
From: https://www.cnblogs.com/mathsmouse/p/16734699.html

相关文章

  • 设计模式 -- Prototype(原型模式)
    原型模式(Prototype)使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些......
  • Hiwin直线电机C#MPI控制程序<通讯设置、回原点设置、点动模式、点对点运动、依托Timer
    一、通讯设定与连接√说明与总结:布尔量Connect为驱动器连接与否的标识符,启动时默认为false,即未连接状态; /*-----------------------------------------------*/......
  • 线程优雅停止-两阶段终止模式
    所谓优雅停止,即即将在停止的线程足够的时间完成善后工作,而不是直接杀死线程。假设此时某线程正在独占资源(占有锁),突然对线程的终止,会导致其占有的资源无法得到释放,其他线程......
  • 在MVVM模式下使用命令传多个参数的问题
    最近碰到一个问题,在MVVM模式下进行命令传参时需要传递两个参数:例如类型和ID 解决方法如下<i:Interaction.Triggers><i:EventTriggerEventName=......
  • 组合日记-九月二十六日
    二项式系数中的\(\frac{1}{2}\)\(\displaystyler^{\underline{k}}(r-\frac{1}{2})^{\underline{k}}=\frac{(2r)^{\underline{2k}}}{2^{2k}},k\in\mathbb{N}\)将下降......
  • 通过策略模式实现树状结构的自动生成
    1.树处理器publicabstractclassAbstractTreeHandlerimplementsInitializingBean{@ResourceprivateTreeHandlerContexttreeContext;@Override......
  • 设计模式之状态模式
    实际开发中订单往往都包含着订单状态,用户每进行一次操作都要切换对应的状态,而每次切换判断当前的状态是必须的,就不可避免的引入一系列判断语句,为了让代码更加清晰直观,我们......
  • 初识设计模式 - 桥接模式
    简介桥接设计模式(BridgeDesignPattern)也叫作桥梁模式,其描述是将实现和抽象放在两个不同的类层次中,使两个层次可以独立地变化。桥接模式采用抽象关联取代了传统的多层继......
  • 机器学习设计模式
    机器学习设计模式介绍设计模式是一种将专家的经验和知识记录为可行建议的方法,所有从业者都可以应用这些建议来使用久经考验的方法解决他们的问题。就像我们有传统的软件......
  • 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
    大家好,又见面了。不知道下面这玩意大家有没有见过或者使用过?这是一个插座转换器。我们都知道日常使用的是220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使......