设计模式之组合模式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]

---------------------


 

 

你可能感兴趣的:(java实现)