Java设计模式----组合模式

最近看了一些开源的软件,发现人家的代码写的很漂亮,设计的也很好,于是乎,我便默默的把买来还没看的设计模式之禅拿来,补补基础。

       书本上介绍的模式类型很多,自己见得比较多的可能就是单例、工厂等几个。今天先从组合模式开始,就是随手翻到了这个,也不是书本介绍的第一个。

       组合模式:我的理解就是要解决类似于机构或者文件目录等形式的树状结构图,节点之前既有相同特性,又有差异。节点之前是相互隶属关系,这个隶属关系也很重要,如一个家族中族谱也是一个典型的案例。通过使用组合模式,我们可以方便的存储这样一个结构信息,同时有很松散的新增或者删除其中一个节点,遍历这样一个图谱也是easy的。

        实现该场景的一个经典类图关系

       

       所有的节点都继承基类component,其中Leaf类是指代那些最底层节点,没有子节点的节点。composite类指代含有子节点的节点信息。之所有细分两种情况,因为有些操作,在叶子节点中是禁止的。比如add,remove;

       根据书中的理论,还有一种不安全的实现方法,这种方法就是去掉叶子节点,所有节点都一样,但是要求基类的所有方法都抛一个异常,这样叶子节点就在调用时检查到异常。

       下面,我来根据一个场景实现下组合模式。比如公司有ceo一名,两个经理managera,mangerb,两个收下分别两个小兵

employeaa,employeeab,employeeba,employeebb,实现这样组织结构的存储和遍历。

       首先是抽象类staff:


package com.stone.patter.composite;


public class Staff {


	protected String name;


	protected int salary;


	protected String position;


	public Staff(String name, int salary, String position) {
		this.name = name;
		this.salary = salary;
		this.position = position;
	}


	protected void addStaff(Staff staff) {
		throw new RuntimeException("非法操作:addStaff");
	}


	protected void removeStaff(Staff staff) {
		throw new RuntimeException("非法操作:removeStaff");
	}


	protected void printInfo() {
		System.out.println("名字:" + name + " ,职位:" + position + " ,薪水:" + salary);
	}
}


其次分别编写经理、CEO、小喽喽:


package com.stone.patter.composite;

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

public class Manager extends Staff {

	private List<Staff> staffs = new ArrayList<>();

	public Manager(String name, int salary, String position) {
		super(name, salary, position);
	}

	@Override
	protected void addStaff(Staff staff) {
		staffs.add(staff);
	}

	@Override
	protected void removeStaff(Staff staff) {
		staffs.remove(staff);
	}

	@Override
	protected void printInfo() {
		super.printInfo();
		for (Staff staff : staffs) {
			staff.printInfo();
		}
	}
}



package com.stone.patter.composite;

public class Employee extends Staff {

	public Employee(String name, int salary, String position) {
		super(name, salary, position);
	}

}

测试类

package com.stone.patter.composite;

public class Client {

	public static void main(String[] args) {
		Staff ceo = new Manager("执行官1", 100000, "CEO");
		Staff managera = new Manager("经理1", 10000, "经理");
		Staff managerb = new Manager("经理2", 10000, "经理");
		Staff empaa = new Manager("小喽喽1", 1000, "职员");
		Staff empab = new Manager("小喽喽2", 1000, "职员");
		Staff empba = new Manager("小喽喽3", 1000, "职员");
		Staff empbb = new Manager("小喽喽4", 1000, "职员");
		managera.addStaff(empaa);
		managera.addStaff(empab);
		managerb.addStaff(empba);
		managerb.addStaff(empbb);
		ceo.addStaff(managera);
		ceo.addStaff(managerb);
		ceo.printInfo();
	}

}

测试结果

名字:执行官1 ,职位:CEO ,薪水:100000
名字:经理1 ,职位:经理 ,薪水:10000
名字:小喽喽1 ,职位:职员 ,薪水:1000
名字:小喽喽2 ,职位:职员 ,薪水:1000
名字:经理2 ,职位:经理 ,薪水:10000
名字:小喽喽3 ,职位:职员 ,薪水:1000
名字:小喽喽4 ,职位:职员 ,薪水:1000




Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值