zoukankan      html  css  js  c++  java
  • 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现)

      “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊。”“当然”“没有?”“有啊。别急,一会人就到了。”

    组合模式之自我介绍

      “请问你是?怎么什么都不说就直接上来了。”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着。”“哦,你就是组合模式啊,久仰久仰。”“失敬失敬。”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.就是说将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合的使用具有一致性。我的通用类图如下所示:

      

      用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求,如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

    组合模式之自我分析

      优点:

    • 定义了包含基本对象和组合对象的类的层次结构。基本对象可以被组合成更复杂的组合对象,这个组合又会被组合,不断递归下去。
    • 简化客户代码。客户可以一致的使用组合结构和单个对象。
    • 使得更容易增加新增类型的组件。  

      缺点:

    • 很难限制组合中的组件。有时希望一个组合只能有某些特定组件。使用Composite时,不能依赖类型系统施加这些约束,而必须要在运行时刻进行检查。

    组合模式之实现

      实现这么简单的事还需要举栗子么?(PS:别废话,这个东西是赖不掉的,想当年工厂方法和抽象工厂夫妻俩就没赖掉。)那个好吧,我就举个栗子以便于理解:

      首先是抽象的Component类: 

    1 public abstract class Component{
    2     //部分与整体共享的方法
    3     public void doSth(){
    4         
    5     }
    6 }

      接下来是继承自树枝的类的实现,里面包含增加、删除以及获得分支下所有的叶子或分支组件的方法,代码如下:

     1 public class Composite extends Component{
     2     //Component容器
     3     private ArrayList<Component> compList = new ArrayList<>();
     4     //增加叶子/树枝节点
     5     public void add (Component component){
     6         this.compList.add(component);
     7     }
     8 
     9     //删除叶子/树枝节点
    10     public void remove(Component component){
    11         this.compList.remove(component);
    12     }
    13 
    14     //获得分支下所有的叶子/分支Component
    15     public ArrayList<Component> getChildren(){
    16         return this.compList;
    17     }
    18 }
    View Code

      叶子节点的实现方法:

    1 public class Leaf extends Component{
    2     
    3 }

      组合模式就这么简单的实现了。为表诚意,我再实现个场景类来说明如何调用这些个方法:  

     1 public class Client{
     2     public static void main(String[] args) {
     3         //创建根节点
     4         Composite root = new Composite();
     5         root.doSth();
     6         //创建一个树枝
     7         Composite branch = new Composite();
     8         //创造叶子
     9         Leaf leaf = new Leaf();
    10         //组合
    11         root.add(branch);
    12         branch.add(leaf);
    13     }
    14 }
    View Code

      此类中,显示创建根节点,然后是树枝,最后是叶子,然后这些被组合成树。就此结束。

    组合模式之应用场景

    • 表示整体-部分的层次结构。
    • 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。

      好了,设计模式之23式至此完结。撒花,撤走~撒有那拉,米娜。

     

     

     

      PS:本博客欢迎转发,但请注明博客地址及作者~

      博客地址:http://www.cnblogs.com/voidy/

      博客新址:http://voidy.net

      <。)#)))≦

     

  • 相关阅读:
    牛客小白月赛-鲲
    HDU-1069 Monkey and Banana
    HDU-1159 Common Subsequence
    Python3-提高效率的方法
    Python3-ORM-Sqlalchemy
    redis端口6379的由来
    Linux环境下的network IO
    Yii2-设置和获取、删除Cookies空值分析(有代码)
    PHP中的运算符---位运算符、递增递减运算符、三元运算符、字符串运算符、数组运算符、类型运算符、错误控制运算符
    redis的五种存储类型的具体用法
  • 原文地址:https://www.cnblogs.com/voidy/p/4264040.html
Copyright © 2011-2022 走看看