某移动社交软件欲增加一个群组(Group)功能。通过设置,用户可以将自己的动态信息,包括最新动态、新上传的视频以及分享的链接等,分享给某个特定的成员(Member),也可以分享给某个群组中的所有成员;用户可以将成员添加至某个指定的群组;此外,还允许用户在一个群组中添加子群组,以便更加灵活地实现面向特定人群的信息共享。

选择一种合适的设计模式来设计该群组功能,要求给出该模式的名称及定义,结合场景绘制相应的结构图并编程模拟实现(类名、方法名和属性名可自行定义)。

类图:

设计模式-组合模式

模式:组合模式

定义:组合多个对象形成树型结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。

Composite PatternCompose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual object and compositions of object uniformly.

实现代码:

抽象构件类Component 

package CompositePattern;

 

public abstract class Component {

    public abstract void add(Component ccomponent);

    public abstract void remove(Component component);

    public abstract void share(Component component) ;

}

叶子构件类Member

package CompositePattern;

 

import java.util.ArrayList;

 

public class Member extends Component {

 

    public Member(String name){

    this.name=name;

    }

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

 

    private String name;

    @Override

    public void add(Component ccomponent) {

        System.out.println("调这个函数也没用");

    }

 

    @Override

    public void remove(Component component) {

        System.out.println("调这个函数也没用");

    }

 

    @Override

    public void share(Component component) {

        if (component instanceof Group){

        ArrayList<Component> components = ((Group)component).getComponents();

 

        if (components.contains(this)){

            components.remove(this);

 

        }

        for (Component obj:components){

            obj.share(obj);

        }

        components.add(this);

        }else if (component instanceof Member){

            ((Member)component).onMessage();

        }

 

    }

 

    public void onMessage() {

        System.out.println(this.getName()+"收到消息");

    }

}

容器构件类Group 

package CompositePattern;

 

import java.util.ArrayList;

 

public class Group extends Component {

    public  Group(String name){

        this.name = name;

    }

 

    public ArrayList<Component> getComponents() {

        return components;

    }

 

    public String getName() {

 

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    private String name;

    public ArrayList<Component> components = new ArrayList<>();

 

    @Override

    public void add(Component ccomponent) {

        components.add(ccomponent);

 

    }

 

    @Override

    public void remove(Component component) {

        components.remove(component);

    }

 

    @Override

    public void share(Component component) {

        if (component instanceof Group){

            ArrayList<Component> com = ((Group)component).getComponents();

            for (Component object:components){

             object.share(object);

            }

        }else  if (component instanceof  Member){

            ((Member)component).onMessage();

        }

 

    }

 

}

客户端类Client 

package CompositePattern;

 

public class Client {

    public static void main(String[] args) {

 

    Component group1 = new Group("Group1");

    Component member1 = new Member("member1");

    Component member2 = new Member("member2");

    Component member3 = new Member("member3");

    Component member4 = new Member("member4");

    group1.add(member1);

    group1.add(member2);

    group1.add(member3);

    group1.add(member4);

    System.out.println(((Member)member1).getName()+"分享了一条新动态");

    member1.share(group1);

        System.out.println("---------------------------");

        Component group2 = new Group("group2");

        group2.add(group1);

        Component member5 = new Member("member5");

        group2.add(member5);

        System.out.println(((Member)member5).getName()+"分享了一条新动态");

        member5.share(group2);

    }

}

 


相关文章: