阅读 45

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


  • 相关阅读:
    判断数组的方法
    介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块?
    因为这样那样的原因又滚回来了
    AFO成功
    SDOI2018
    TJOI2018
    杂题
    线段树合并
    几个dp的陈年老题
    【自家测试】2018-5-9

  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3028421.html

  • 最新文章

  • Java Array 常见报错npe (NullPointerException )、ArrayIndexOutOfBoundsException
    Java Array数组使用详解
    java 判断语句和循环语句
    java 键盘录入(Scanner)
    JAVA 中的命名规则
    java中53个关键字的意义及使用方法
    java day01记录
    Java中@Override的作用
    java语言基础
    java第一课 面向对象的编程概念

  • 热门文章

  • JAVA helloworld!
    java入门--学习地址(编译与反编译)
    setTimeout还有第三个参数
    startsWith
    聊聊 Vue 的双向数据绑定,Model 如何改变 View,View 又是如何改变 Model 的
    cookie与token
    全局作用域中,用 const 和 let 声明的变量不在 window 上,那到底在哪里?如何去获取?
    前端中的模块化开发
    介绍下观察者模式和订阅-发布模式的区别,各自适用于什么场景
    介绍下重绘和回流(Repaint & Reflow),以及如何进行优化



文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐