Radio

一个小小程序员

0%

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

示例演示:
  1. 我们创建一个观察者的抽象类observer和被观察的对象people

    1
    2
    3
    4
    5
    6
    7
    8
    package test.observer;

    public abstract class Observer {

    protected People people;

    public abstract void update(int status);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    package test.observer;

    import lombok.Data;

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

    @Data
    public class People {
    private List<Observer> observers = new ArrayList<>();

    private int status;

    public void setStatus(int status) {
    this.status = status;
    this.notifyAll(status);
    }

    public void add(Observer observer) {
    observers.add(observer);
    }

    public void notifyAll(int status) {
    for (Observer observer : observers) {
    observer.update(status);
    }
    }

    }
  2. 创建三个观察者对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.observer;

    public class ObserverOne extends Observer {
    public ObserverOne(People people) {
    this.people = people;
    this.people.add(this);
    }

    @Override
    public void update(int status) {
    System.out.println("ObserverOne status change: " + people.getStatus());
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.observer;

    public class ObserverTwo extends Observer {
    public ObserverTwo(People people) {
    this.people = people;
    people.add(this);
    }

    @Override
    public void update(int status) {
    System.out.println("ObserverTwo status change: " + people.getStatus());
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.observer;

    public class ObserverThree extends Observer {
    public ObserverThree(People people) {
    this.people = people;
    people.add(this);
    }

    @Override
    public void update(int status) {
    System.out.println("ObserverThree status change: " + people.getStatus());
    }
    }
  3. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.observer;

    public class ObserverDemo {
    public static void main(String[] args) {
    People people = new People();
    new ObserverOne(people);
    new ObserverTwo(people);
    new ObserverThree(people);

    people.setStatus(1);
    System.out.println("---------------------------------");
    people.setStatus(2);
    }
    }

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    ObserverOne status change: 1
    ObserverTwo status change: 1
    ObserverThree status change: 1
    ---------------------------------
    ObserverOne status change: 2
    ObserverTwo status change: 2
    ObserverThree status change: 2
说明:

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

比如:Windows 里的 ctrl + z;浏览器的后退; 数据库的事务管理等

示例演示:
  1. 我们创建三个类,一个people类,包含一个status状态的字段,一个存储people状态的类,一个获取people状态的类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package test.memento;

    import lombok.Data;

    @Data
    public class People {
    private String status;

    public People(String status) {
    this.status = status;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package test.memento;

    import lombok.Data;

    @Data
    public class PeopleStatusSave {
    private String status;

    public People saveStatus() {
    return new People(status);
    }

    public void getStatus(People people) {
    status = people.getStatus();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.memento;

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

    public class PeopleRecover {
    private List<People> peopleList = new ArrayList<>();

    public void add(People people) {
    peopleList.add(people);
    }

    public People get(int index) {
    return peopleList.get(index);
    }

    }
  2. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    package test.memento;

    public class MementoDemo {
    public static void main(String[] args) {
    PeopleStatusSave peopleStatus = new PeopleStatusSave();
    PeopleRecover peopleRecover = new PeopleRecover();

    peopleStatus.setStatus("11111");
    peopleRecover.add(peopleStatus.saveStatus());

    peopleStatus.setStatus("22222");
    peopleRecover.add(peopleStatus.saveStatus());

    peopleStatus.setStatus("33333");
    peopleRecover.add(peopleStatus.saveStatus());

    peopleStatus.setStatus("44444");
    peopleRecover.add(peopleStatus.saveStatus());

    System.out.println("current: " + peopleStatus.getStatus());

    peopleStatus.getStatus(peopleRecover.get(0));
    System.out.println("first: "+ peopleStatus.getStatus());

    peopleStatus.getStatus(peopleRecover.get(1));
    System.out.println("second: "+ peopleStatus.getStatus());

    }
    }

    运行结果:

    1
    2
    3
    current: 44444
    first: 11111
    second: 22222
说明:

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合, 使代码易于维护。中介者模式属于行为型模式。

示例演示:
  1. 创建一个people类,并将其中的say方法单独提取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package test.mediator;

    import lombok.Data;

    @Data
    public class People {
    private String name;

    public People(String name) {
    this.name = name;
    }

    public void say(String message) {
    Say.say(this, message);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package test.mediator;

    import java.util.Date;

    public class Say {

    public static void say(People people, String message) {
    System.out.println(new Date().toString() + " [" + people.getName() + "]:" + message);
    }
    }
  2. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package test.mediator;

    public class MediatorDemo {
    public static void main(String[] args) {
    People people1 = new People("people1");
    People people2 = new People("people2");
    people1.say("hello1");
    people2.say("hello2");
    }
    }

    运行结果:

    1
    2
    Thu Nov 05 11:43:05 CST 2020 [people1]:hello1
    Thu Nov 05 11:43:05 CST 2020 [people2]:hello2
说明:

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。java中的 iterator。

示例演示:
  1. 首先我们创建一个迭代器接口

    1
    2
    3
    4
    5
    6
    package test.iterator;

    public interface Iterator {
    public boolean hasNext();
    public Object next();
    }
  2. 然后创建一个获取迭代器的接口

    1
    2
    3
    4
    5
    package test.iterator;

    public interface Container {
    public Iterator getIterator();
    }
  3. 创建两个接口的实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package test.iterator;

    import java.util.List;

    public class People implements Container {
    public List<String> names;

    @Override
    public Iterator getIterator() {
    return new NameIterator();
    }

    private class NameIterator implements Iterator {
    int index;

    @Override
    public boolean hasNext() {
    if (index < names.size()) {
    return true;
    }
    return false;
    }

    @Override
    public Object next() {
    if (this.hasNext()) {
    return names.get(index++);
    }
    return null;
    }
    }
    }
  4. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package test.iterator;

    import java.util.ArrayList;

    public class IteratorDemo {
    public static void main(String[] args) {
    People people = new People();
    people.names = new ArrayList<>();
    people.names.add("a");
    people.names.add("b");
    people.names.add("c");
    people.names.add("d");
    Iterator iter = people.getIterator();
    while (iter.hasNext()){
    System.out.println(iter.next());
    }
    }
    }

    演示结果:

    1
    2
    3
    4
    a
    b
    c
    d
说明:

优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

示例演示:
  1. 创建一个生物接口,并提供一个判断的方法

    1
    2
    3
    4
    5
    6
    7
    8
    package test.interpreter;
    /**
    * 所有生物的标识
    */
    public interface Organism {

    public boolean isOrganism(String context);
    }
  2. 创建一个people实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.interpreter;

    public class People implements Organism {
    private String data;

    public People(String data) {
    this.data = data;
    }

    @Override
    public boolean isOrganism(String context) {
    if (context.contains(data)) {
    return true;
    }
    return false;
    }
    }
  3. 分别编写两个判断是否是people的实体,一个是或,一个是且

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package test.interpreter;

    public class OrPeople implements Organism {
    private Organism org1 = null;
    private Organism org2 = null;

    public OrPeople(Organism org1, Organism org2) {
    this.org1 = org1;
    this.org2 = org2;
    }

    @Override
    public boolean isOrganism(String context) {
    return org1.isOrganism(context) || org2.isOrganism(context);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package test.interpreter;

    public class AndPeople implements Organism {
    private Organism org1 = null;
    private Organism org2 = null;

    public AndPeople(Organism org1, Organism org2) {
    this.org1 = org1;
    this.org2 = org2;
    }

    @Override
    public boolean isOrganism(String context) {
    return org1.isOrganism(context) && org2.isOrganism(context);
    }
    }
  4. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package test.interpreter;

    public class InterpreterDemo {
    public static Organism getOrPeople(){
    Organism o1 = new People("people");
    Organism o2 = new People("animal");
    return new OrPeople(o1,o2);
    }

    public static Organism getAndPeople(){
    Organism o1 = new People("people");
    Organism o2 = new People("animal");
    return new AndPeople(o1,o2);
    }

    public static void main(String[] args) {
    Organism orPeople = getOrPeople();
    Organism andPeople = getAndPeople();
    System.out.println("people or animal is people? "+orPeople.isOrganism("people"));
    System.out.println("people and animal is people? "+andPeople.isOrganism("people"));
    }
    }

    演示结果:

    1
    2
    people or animal is people? true
    people and animal is people? false
说明:

优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

示例演示:
  1. 我们创建一个people实体,并提供两个方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package test.command;

    public class People {

    private Integer id = 1;
    private String name = "1";

    public void add() {
    System.out.println("add id: " + id + " name:" + name);
    }

    public void remove() {
    System.out.println("remove id: " + id + " name:" + name);
    }
    }
  2. 新建一个order命令的接口

    1
    2
    3
    4
    5
    package test.command;

    public interface Order {
    void execute();
    }
  3. 分别对people的add和remove方法创建order接口的实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.command;

    public class PeopleAdd implements Order {
    private People people;

    public PeopleAdd(People people) {
    this.people = people;
    }

    @Override
    public void execute() {
    people.add();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.command;

    public class PeopleRemove implements Order {
    private People people;

    public PeopleRemove(People people) {
    this.people = people;
    }

    @Override
    public void execute() {
    people.remove();
    }
    }
  4. 创建一个命令调用实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package test.command;

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

    public class Broker {
    private List<Order> orders = new ArrayList<>();

    public void takeOrder(Order order) {
    orders.add(order);
    }

    public void placeOrders() {
    for (Order order : orders) {
    order.execute();
    }
    orders.clear();
    }
    }
  5. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.command;

    public class CommandDemo {
    public static void main(String[] args) {
    People people = new People();
    PeopleAdd peopleAdd = new PeopleAdd(people);
    PeopleRemove peopleRemove = new PeopleRemove(people);

    Broker broker = new Broker();
    broker.takeOrder(peopleAdd);
    broker.takeOrder(peopleRemove);
    broker.placeOrders();
    }
    }

    运行结果:

    1
    2
    add id: 1name:1
    remove id: 1name:1
说明:

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

示例演示:
  1. 我们举个例子,王者荣耀中,如果你是黄金,那么你肯定要经历白银和青铜,如果你是白银,那么你肯定要经历青铜,就是等级是一级一级来的,我们创建一个people的抽象类,来说明这个级别

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package test.chain;

    public abstract class AbstractPeople {
    public static int gold = 1;
    public static int silver = 2;
    public static int bronze = 3;

    protected int level;

    protected AbstractPeople nextPeople;

    public void setNextPeople(AbstractPeople nextPeople) {
    this.nextPeople = nextPeople;
    }

    public void loadMessage(int level, String message) {
    if (this.level <= level) {
    write(message);
    }
    if (nextPeople != null) {
    nextPeople.loadMessage(level, message);
    }
    }

    abstract protected void write(String message);
    }
  2. 分别创建各个等级的实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.chain;

    public class GoldPeople extends AbstractPeople {

    public GoldPeople(int level) {
    this.level = level;
    }

    @Override
    protected void write(String message) {
    System.out.println("write goldpeople:" + message);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.chain;

    public class SilverPeople extends AbstractPeople {

    public SilverPeople(int level) {
    this.level = level;
    }

    @Override
    protected void write(String message) {
    System.out.println("write silverpeople:" + message);
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.chain;

    public class BronzePeople extends AbstractPeople {

    public BronzePeople(int level) {
    this.level = level;
    }

    @Override
    protected void write(String message) {
    System.out.println("write bronzepeople:" + message);
    }
    }
  3. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package test.chain;

    public class ChainDemo {
    public static AbstractPeople getPeople() {
    AbstractPeople goldPeople = new GoldPeople(AbstractPeople.gold);
    AbstractPeople silverPeople = new SilverPeople(AbstractPeople.silver);
    AbstractPeople bronzePeople = new BronzePeople(AbstractPeople.bronze);

    goldPeople.setNextPeople(silverPeople);
    silverPeople.setNextPeople(bronzePeople);
    return goldPeople;
    }

    public static void main(String[] args) {
    AbstractPeople abstractPeople = getPeople();
    abstractPeople.loadMessage(AbstractPeople.gold,"this is gold");
    System.out.println("---------------------------------");
    abstractPeople.loadMessage(AbstractPeople.silver,"this is silver");
    System.out.println("---------------------------------");
    abstractPeople.loadMessage(AbstractPeople.bronze,"this is bronze");
    }
    }

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    write goldpeople:this is gold
    ---------------------------------
    write goldpeople:this is silver
    write silverpeople:this is silver
    ---------------------------------
    write goldpeople:this is bronze
    write silverpeople:this is bronze
    write bronzepeople:this is bronze
说明:

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。最典型的就是SpringAOP,我们不再直接new对象了,而是通过spring动态代理来获取对象。

示例演示:
  1. 我们创建一个people的接口

    1
    2
    3
    4
    5
    6
    package test.proxy;

    public interface People {

    void say();
    }
  2. 创建一个实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package test.proxy;

    public class PeopleImpl implements People {
    private String name;

    public PeopleImpl(String name) {
    this.name = name;
    System.out.println("Loading...");
    }

    @Override
    public void say() {
    System.out.println("my name is " + name);
    }
    }
  3. 创建一个实现类的代理类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package test.proxy;

    public class ProxyPeople implements People {
    private PeopleImpl peopleImpl;
    private String name;

    public ProxyPeople(String name) {
    this.name = name;
    }

    @Override
    public void say() {
    if (peopleImpl == null) {
    peopleImpl = new PeopleImpl(name);
    }
    peopleImpl.say();
    }
    }
  4. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package test.proxy;

    public class ProxyDemo {
    public static void main(String[] args) {
    People people = new ProxyPeople("radio");
    people.say();
    System.out.println("---------------------------------");
    people.say();
    }
    }

    运行结果:

    1
    2
    3
    4
    Loading...
    my name is radio
    ---------------------------------
    my name is radio
说明:

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

示例演示:
  1. 创建一个people实体和一个animal实体

    1
    2
    3
    4
    5
    6
    7
    package test.facade;

    public class People {
    public void say() {
    System.out.println("my name is people");
    }
    }
    1
    2
    3
    4
    5
    6
    7
    package test.facade;

    public class Animal {
    public void say() {
    System.out.println("my name is animal");
    }
    }
  2. 创建一个组合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package test.facade;

    public class Facade {
    private People people;
    private Animal animal;

    public Facade() {
    people = new People();
    animal = new Animal();
    }

    public void peopleSay() {
    people.say();
    }

    public void animalSay() {
    animal.say();
    }
    }
  3. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.facade;

    public class FacadeDemo {
    public static void main(String[] args) {
    Facade facade = new Facade();
    facade.peopleSay();
    facade.animalSay();
    }
    }

    运行结果:

    1
    2
    my name is people
    my name is animal
说明:

上诉示例达到的效果就是我们说的开局一人一狗,默认绑定

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

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

示例演示:
  1. 创建一个people实体类,让这个实体类里面依然包含people的对象集合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package test.composite;

    import lombok.Data;

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

    @Data
    public class People {
    private Integer id;
    private String name;

    private List<People> peoples;

    public People(Integer id, String name) {
    this.id = id;
    this.name = name;
    peoples = new ArrayList<>();
    }

    public void add(People people) {
    peoples.add(people);
    }
    }
  2. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package test.composite;

    public class CompositeDemo {
    public static void main(String[] args) {
    People people = new People(1,"1");
    People people2 = new People(2,"2");
    People people3 = new People(3,"3");
    People people4 = new People(4,"4");

    people.add(people2);
    people.add(people3);
    people.add(people4);

    System.out.println(people.toString());

    }
    }

    运行结果:

    1
    People(id=1, name=1, peoples=[People(id=2, name=2, peoples=[]), People(id=3, name=3, peoples=[]), People(id=4, name=4, peoples=[])])
    说明:

    1、组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。

    2、所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。