设计模式系列
1、组合模式
2、策略模式
3、单例模式
4、原型模式
5、模板模式
6、观察者模式
7、享元模式
8、装饰着模式
9、门面模式
10、责任链模式
11、建造者模式
12、适配器模式
什么是组合模式
组合模式就是把类似的对象组合在一个对象中方便使用,怎么组合呢,就是树形结构来组合。比如用人来作为一个对象的话,我们就可以用组合模式来组合人际关系,我有家人、朋友、同事等关系的人,我的朋友又有他的家人、朋友、同事等关系的人,以此类推就会有好多个类似的对象了。
码云地址:去看源码
示例
1、定义一个 Person
定义一个 Person ,每个人都有自己的朋友,朋友还有他们自己的朋友,朋友的朋友还要朋友,这样就构成了一个关系网。
我们从一个关系网定一个跟节点,比如说我,下面有兄弟姐妹,我的兄弟姐妹又有他们的朋友,朋友又有自己的兄弟姐妹等。
那么我们在工作中也有这样的常见,相当于自关联表结构。
class Person{
private String name;
private int age;
private int gender;
private List<Person> friends = new ArrayList<>();
public Person(String name, int age, int gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void addPerson(Person person){
this.friends.add(person);
}
public void delPerson(Person person){
this.friends.remove(person);
}
public List<Person> getFriends() {
return friends;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
2、测试
public class CompositeTest {
public static void main(String[] args) {
Person person = new Person("Phen", 24, 1);
person.addPerson(new Person("Ryan", 28, 1));
Person thor = new Person("Thor", 29, 1);
thor.addPerson(new Person("wenju", 26, 0));
thor.addPerson(new Person("jiazhen", 26, 0));
person.addPerson(thor);
System.out.println(person);
System.out.println("我的朋友:");
person.getFriends().forEach(p -> {
System.out.println(p);
if(p.getFriends().size() > 0){
System.out.println(p.getName() + "的朋友:");
p.getFriends().forEach(System.out::println);
}
});
}
}
执行结果:
Person{name=‘Phen’, age=24, gender=1}
我的朋友:
Person{name=‘Ryan’, age=28, gender=1}
Person{name=‘Thor’, age=29, gender=1}
Thor的朋友:
Person{name=‘wenju’, age=26, gender=0}
Person{name=‘jiazhen’, age=26, gender=0}
从执行结果可以看出我的朋友是 Ryan,Thor, 那么 Thor 的朋友是 wenju, jiazhen,那么wenju, jaizhen 也是我的朋友,也可以往我的下面 add, 这样的话最后就构成了一个复杂的关系网,也就是把类似的对象组合到一起了。
3、总结
总而言之,组合模式就是为了更好的组合我们的业务数据,有些是自己关联,比如说在工作中,有的页面的菜单是动态的,用户可以自定义,那么我们就可以用 Menu 里面有 子 Menu, 菜单下面有子菜单。