设计模式(8)-结构型-组合模式(Composite)

组合模式是结构型设计模式中使用频率非常高的模式之一。 通常它将一个对象包装成树型结构,以表示“整体”与“部分”的层次结构,从用户的角度来看,单个对象与组合对象,看起来,具有一致的接口。

适用性描述:

  1. 你想描述的对象,具有部分-整体的层次结构
  2. 用户希望能忽略组合对象与单个对象的不同,用户将统一的使用的使用组合结构中的所有对象

参与者描述:

    1.Component
      为组合中的对象声明接口。
      在适当的情况下,实现所有类共有接口的缺省行为。
      声明一个接口用于访问和管理Component的子组件。
      (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

    2.Leaf
      在组合中表示叶节点对象,叶节点没有子节点。
      在组合中定义节点对象的行为。

    3.Composite
      定义有子部件的那些部件的行为。
      存储子部件。
      在Component接口中实现与子部件有关的操作。

    4.Client
      通过Component接口操纵组合部件的对象。

示例:

package com.sql9.structured;

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

//字符片段
abstract class Piece {
    // 统计字数
    public abstract int count();
    
    public abstract void add(Piece p);
    public abstract void remove(Piece p);
    
    protected List<Piece> pieces; 
    
    public List<Piece> getPieces() {
	return pieces;
    }
    
}

class Sentence extends Piece {
    String word;
    public Sentence(String word) {
	this.word = word;
	pieces = null;
    }
    
    public int count() {
	return word == null ? 0 : word.length();
    }
    
    public void add(Piece p) {
	
    }
    
    public void remove(Piece p) {
	
    }
}

class Paragraph extends Piece {
    public Paragraph() {
	pieces = new ArrayList<Piece>();
    }
    public int count() {
	int count = 0;
	for (Piece p: pieces) {
	    count += p.count();
	}
	return count;
    }
    
    public void add(Piece p) {
	pieces.add(p);
    }
    
    public void remove(Piece p) {
	pieces.remove(p);
    }
}

public class CompositeTest {

    public static void main(String[] args) {

	Piece child = new Sentence("abcde");
	Piece child2 = new Sentence("123");
	Piece child3 = new Sentence("456789");
	Piece para = new Paragraph();
	Piece para2 = new Paragraph();
	para.add(child);
	para.add(child2);
	para2.add(child3);
	para2.add(para);
	
	int count = para2.count();
	System.out.println("count of para2 = " + count);
    }

}

结果:

count of para2 = 14


<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值