设计模式之组合模式java实现

组合模式:允许你将对象组合成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

案例情景:上次,我和友人去超市分头购物,在结帐时,我们遍历一下我们的 “扫货” 清单(遍历打印购物清单),在实现上,Me使用ArrayList,友人使用Thing[]数组,给遍历造成困扰。

在遍历时发现赠送的商品,没有打印。现在我们有打印赠送物品的需求。


AbstractThing.java

public abstract class AbstractThing {
	public abstract String toString();
	public void add(AbstractThing thing){};
	public void remove(AbstractThing thing){};
	
}

Thing.java

import java.util.ArrayList;
import java.util.Iterator;


public class Thing extends AbstractThing{
	private ArrayList<AbstractThing> list = new ArrayList<AbstractThing>();
	
	private String name;
	private long price;
	public Thing(String name,long price){
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		String returnString  = "Thing [name=" + name + ", price=" + price + "]";
		for(Iterator<AbstractThing> iterator=list.iterator();iterator.hasNext();){
			returnString +=iterator.next();
		}
		return returnString;
	}
	@Override
	public void add(AbstractThing thing) {
		list.add(thing);
	}
	@Override
	public void remove(AbstractThing thing) {
		list.remove(thing);
	}
	
}

ThingItem.java

public class ThingItem extends AbstractThing{
	private String name;
	private long price;
	public ThingItem(String name,long price){
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "赠送 [name=" + name + ", price=" + price + "]";
	}
}

ArrayIterator.java

import java.util.Iterator;


public class ArrayIterator implements Iterator<Thing>{
	private Thing[] thingArray;
	private int position = 0;
	public ArrayIterator(Thing[] array){
		thingArray = array;
	}
	
	@Override
	public boolean hasNext() {
		while(position<thingArray.length && thingArray[position] != null){
			return true;
		}
		return false;
	}

	@Override
	public Thing next() {
		return thingArray[position++];
	}

	@Override
	public void remove() {
		//noting to do 
	}

}


Me.java

import java.util.ArrayList;
import java.util.Iterator;


public class Me {
	private ArrayList<Thing> shopping = new ArrayList<Thing>();
	
	public Me(){
		shopping.add(new Thing("巧克力", 35));
		shopping.add(new Thing("凉茶", 4));
		shopping.add(new Thing("袜子", 9));
		shopping.add(new Thing("香蕉", 12));
		//买电脑送鼠标,耳机,键盘
		Thing computer = new Thing("电脑", 3000);
		computer.add(new ThingItem("鼠标", 0));
		computer.add(new ThingItem("耳机", 0));
		computer.add(new ThingItem("键盘", 0));
		
		shopping.add(computer);
		
	}
	
	public Iterator<Thing> createIterator(){
		return shopping.iterator();
	}
}


Friends.java

import java.util.Iterator;


public class Friends {
	private Thing[] shopping = new Thing[100];
	
	public Friends(){
		shopping[0] = new Thing("牛奶",15);
		shopping[1] = new Thing("苹果",10);
		shopping[2] = new Thing("薯片",4);
		
		//买手机送蓝牙耳机
		Thing phone = new Thing("手机", 2000);
		ThingItem bluetoothHeadset = new ThingItem("蓝牙耳机", 0);
		phone.add(bluetoothHeadset);
		
		shopping[3] = phone;
	}
	
	public Iterator<Thing> createIterator(){
		return new ArrayIterator(shopping);
	}
}


Test.java

import java.security.AllPermission;
import java.util.ArrayList;
import java.util.Iterator;


public class Test {
	public static void main(String args[]){
		ArrayList<Iterator<Thing>> allIterator = new ArrayList<Iterator<Thing>>();
		Me me = new Me();
		Friends friends = new Friends();
		
		Iterator<Thing> meIterator = me.createIterator();
		Iterator<Thing> friendsIterator = friends.createIterator();
		allIterator.add(meIterator);
		allIterator.add(friendsIterator);
		
		for(Iterator<Thing> iterator:allIterator){
			while(iterator.hasNext()){
				System.out.println(iterator.next());
			}
			System.out.println("---------------------");
		}
	}
}


测试结果:

Thing [name=巧克力, price=35]
Thing [name=凉茶, price=4]
Thing [name=袜子, price=9]
Thing [name=香蕉, price=12]
Thing [name=电脑, price=3000]赠送 [name=鼠标, price=0]赠送 [name=耳机, price=0]赠送 [name=键盘, price=0]
---------------------
Thing [name=牛奶, price=15]
Thing [name=苹果, price=10]
Thing [name=薯片, price=4]
Thing [name=手机, price=2000]赠送 [name=蓝牙耳机, price=0]
---------------------


原文地址:https://www.cnblogs.com/xinyuyuanm/p/3028423.html