代码人生

结构设计模式:组合模式(Composite Pattern)

代码人生 http://www.she9.com 2018-08-11 23:46 出处:网络 编辑:@技术狂热粉
在前面,我们了解了适配器模式、用例和桥接模式。我们将在本文中研究的模式是复合模式。

在前面,我们了解了适配器模式、用例和桥接模式。我们将在本文中研究的模式是复合模式。


通过遵循复合模式,我们将对象“组合”成树结构,表示部分-整体层次结构。因此,客户机可以统一地处理单个对象和组合。


通过引用层次结构这个词,首先想到的是组织。一个军事组织的复合模式是一个很好的例子。


军事人员最基本的行动之一就是执行命令。因此,我们将创建一个指定执行命令能力的接口。

        package com.gkatzioura.design.structural.composite;        
        
        public interface MilitaryPersonnel {
        
            void executeOrder();
        
        }

列兵是军队中最低的军衔。列兵不能委派任务或发出命令。因此,他们将执行一个任务。

        package com.gkatzioura.design.structural.composite;        
        
        public class Private implements MilitaryPersonnel {
        
            @Override
            public void executeOrder() {
        
            }
        
        }

在列兵之上,还有其他军衔,如少校、中校、上校等。官员执行命令,但他们也可以分配命令。因此,军官接口将指定分配订单的能力。

        package com.gkatzioura.design.structural.composite;        
        
        public interface Officer {
        
            void assignOrder();
        
        }

要知道,一个军官,为了执行一个命令,他会自己采取一些行动,他也会给低级别的人员下达一些命令。


接下来,中尉将能够执行命令并将命令分配给比他级别低的士兵。

        package com.gkatzioura.design.structural.composite;        
        
        import java.util.ArrayList;
        import java.util.List;
        
        public class Lieutenant implements MilitaryPersonnel, Officer {
        
            private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();
        
            public Lieutenant(List<MilitaryPersonnel> lowerRankersonel) {
                this.lowerRankersonel = lowerRankersonel;
            }
        
            public void addPrivateUnderCommand(Private soldier) {
                lowerRankersonel.add(soldier);
            }
        
            @Override
            public void executeOrder() {
        
                //other actions
        
                assignOrder();
        
                //other actions.
            }
        
            @Override
            public void assignOrder() {
        
                lowerRankersonel.forEach(lr->lr.executeOrder());
            }
        }

中尉具有的功能也适用于少校,少校能够执行命令并将命令下达给下级。

        package com.gkatzioura.design.structural.composite;        
        
        import java.util.ArrayList;
        import java.util.List;
        
        public class Colonel implements MilitaryPersonnel, Officer {
        
            private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();
        
            public Colonel(List<MilitaryPersonnel> lowerRankersonel) {
                this.lowerRankersonel = lowerRankersonel;
            }
        
            public void addPrivateUnderCommand(Private soldier) {
                lowerRankersonel.add(soldier);
            }
        
            public void addLieutenantUnderCommand(Lieutenant lieutenant) {
                lowerRankersonel.add(lieutenant);
            }
        
            @Override
            public void executeOrder() {
                //other actions
        
                assignOrder();
        
                //other actions
            }
        
            @Override
            public void assignOrder() {
                lowerRankersonel.forEach(lr->lr.executeOrder());
            }
        }

在我们的场景中,general是最高级别的,因此,当他分配一个订单时,这个订单将由我们实现的组合执行。

                package com.gkatzioura.design.structural.composite;        
        
        import java.util.ArrayList;
        import java.util.List;
        
        public class General implements  Officer {
        
            private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();
        
            public General(List<MilitaryPersonnel> lowerRankersonel) {
                this.lowerRankersonel = lowerRankersonel;
            }
        
            @Override
            public void assignOrder(MilitaryPersonnel militaryPersonnel) {
                militaryPersonnel.executeOrder();
            }
        }

并且,编写一个主类将执行组合的功能:

        package com.gkatzioura.design.structural.composite;        
        
        import java.util.Collections;
        
        public class CompositeScenario {
        
            public static void main(String[] args) {
        
                Private ryan = new Private();
                Lieutenant lieutenant = new Lieutenant(Collections.singletonList(ryan));
                Major major = new Major(Collections.singletonList(lieutenant));
                General general = new General();
                general.assignOrder(major);
            }
        }

正如您所看到的,一般对象是被统一处理成所有对象的客户端。整个层次结构用树形结构表示。private是leaf,少校和中尉代表将请求转发给相应的子组件的组合。

请关注公众号:程序你好
0

精彩评论

暂无评论...
验证码 换一张
取 消