首页 > 编程语言 > 详细

Java设计模式(8):组合模式,案例之京东商城

时间:2021-05-16 19:05:38      阅读:19      评论:0      收藏:0      [点我收藏+]

组合模式

组合模式

  1. 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。

  2. 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

  3. 这种类型的设计模式属于结构型模式。

  4. 组合模式使得用户对单个对象和组合对象的访问具有一致性, 即 :组合能让客户以一致的方式处理个别对象以及组合对象

组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。

  • 组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。
  • 粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。
  • 依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。
  • 策略(Strategies) - 策略表示如何实现组合实体。

组合模式解决的问题

1、组合模式解决这样的问题,当我们的要处理的对象可以生成一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子

技术分享图片

2、我们业务功能:菜单树

3、商城项目,商品分类(京东,淘宝)

技术分享图片

应用实例与代码实现

商城项目,商品分类

京东商城--<数码>,<食品>---<手机,电视,照相机><方面面,辣条>----<苹果,华为,小米><······><······>

代码实现:

  • 定义京东商城抽象类

    package com.atxiaodei.composite;
    
    // 京东商城
    public abstract class JingDShoppingMall {
    	private String name; // 名字
    	private String des; // 说明
    	
    	protected  void add(JingDShoppingMall jidong) {
    		//默认实现
    		throw new UnsupportedOperationException();
    	}
    	
    	protected  void remove(JingDShoppingMall jidong) {
    		//默认实现
    		throw new UnsupportedOperationException();
    	}
    
    	//构造器
    	public JingDShoppingMall(String name, String des) {
    		super();
    		this.name = name;
    		this.des = des;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getDes() {
    		return des;
    	}
    
    	public void setDes(String des) {
    		this.des = des;
    	}
    	
    	//方法print, 做成抽象的, 子类都需要实现
    	protected abstract void print();
    
    }
    
    
  • 京东商城下面的商品类别

    package com.atxiaodei.composite;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    //类别:京东商城下面的商品类别(<数码>,<食品>,<···>)
    public class Digitalgoods extends JingDShoppingMall {
    	
    	// list存放的是商品类别
    	List<JingDShoppingMall> jingDShoppingMalls=new ArrayList<>();
    	
    	
    
    	public Digitalgoods(String name, String des) {
    		super(name, des);
    		// TODO Auto-generated constructor stub
    	}
    
    	// 重写add方法,完成实际需求业务(商城商品类别添加)
    	@Override
    	protected void add(JingDShoppingMall jidong) {
    		jingDShoppingMalls.add(jidong);
    	}
    	
    	// 重写remove方法,完成实际需求业务(商城商品类别移除)
    	@Override
    	protected void remove(JingDShoppingMall jidong) {
    		jingDShoppingMalls.remove(jidong);
    	}
    	
    	@Override
    	protected void print() {
    		System.out.println("------------京东商城商品的类别:" + getName() + ",描述:"+ getDes());
    		//遍历 jingDShoppingMalls 
    		for (JingDShoppingMall jingDShoppingMall : jingDShoppingMalls) {
    			jingDShoppingMall.print();
    		}
    
    	}
    
    }
    
    
  • 商品厂家

    package com.atxiaodei.composite;
    
    import java.util.ArrayList;
    import java.util.List;
    
    // 商品厂家(数码手机的厂家有:小米,华为,苹果)
    public class JingDFactor extends JingDShoppingMall {
    	
    	List<JingDShoppingMall> jingDShoppingMalls=new ArrayList<JingDShoppingMall>();
    	
    
    	public JingDFactor(String name, String des) {
    		super(name, des);
    		// TODO Auto-generated constructor stub
    	}
    
    	// 重写add方法,完成实际需求业务(商品厂家类别添加)
    	@Override
    	protected void add(JingDShoppingMall jidong) {
    		jingDShoppingMalls.add(jidong);
    	}
    	
    	// 重写remove方法,完成实际需求业务(商品厂家类别移除)
    	@Override
    	protected void remove(JingDShoppingMall jidong) {
    		jingDShoppingMalls.remove(jidong);
    	}
    	
    	@Override
    	protected void print() {
    		System.out.println("------------京东商城商品的类别的商品厂家:" + getName() + ",描述:"+ getDes());
    		//遍历 jingDShoppingMalls 
    		for (JingDShoppingMall jingDShoppingMall : jingDShoppingMalls) {
    			jingDShoppingMall.print();
    		}
    
    	}
    
    }
    
    
  • 具体的商品

    package com.atxiaodei.composite;
    
    // 具体的商品
    public class JingdGoods extends JingDShoppingMall {
    
    	// 没有集合
    	
    	public JingdGoods(String name, String des) {
    		super(name, des);
    		// TODO Auto-generated constructor stub
    	}
    
    	//add , remove 就不用写了,因为他是叶子节点
    	
    	@Override
    	public String getName() {
    		// TODO Auto-generated method stub
    		return super.getName();
    	}
    	
    	@Override
    	public String getDes() {
    		// TODO Auto-generated method stub
    		return super.getDes();
    	}
    	
    	@Override
    	protected void print() {
    		// TODO Auto-generated method stub
    		System.out.println(getName());
    	}
    }
    
    
  • 客户端,测试

    package com.atxiaodei.composite;
    
    public class Client {
    	public static void main(String[] args) {// 模拟一个买手机选类型的场景
    		
    		// 京东商城  创建商品类别
    		JingDShoppingMall goodsType=new Digitalgoods("数码", "在京东上面买的数码一般假货比较少");
    		
    		// 京东商城  商品类别创建厂商
    		JingDShoppingMall xiaomiFactor= new JingDFactor("小米厂家", "小米手机一般");
    		JingDShoppingMall huaweiFactor= new JingDFactor("华为厂家", "国产手机,农村人最爱");
    		JingDShoppingMall pgFactor= new JingDFactor("苹果厂家", "苹果手机,年轻人的热爱");
    		
    		//创建各个厂商下面的手机商品
    		//小米
    		xiaomiFactor.add(new JingdGoods("小米1", "小米1"));
    		xiaomiFactor.add(new JingdGoods("小米2", "小米2"));
    		xiaomiFactor.add(new JingdGoods("小米3", "小米3"));
    		
    		//华为
    		huaweiFactor.add(new JingdGoods("华为保驰捷1", "华为保驰捷1"));
    		huaweiFactor.add(new JingdGoods("华为保驰捷2", "华为保驰捷2"));
    		huaweiFactor.add(new JingdGoods("华为保驰捷3", "华为保驰捷3"));
    		
    		//苹果
    		pgFactor.add(new JingdGoods("iphone8", "iphone8"));
    		pgFactor.add(new JingdGoods("iphone11", "iphone11"));
    		pgFactor.add(new JingdGoods("iphone12", "iphone12"));
    		
    		// 将厂商加入商品类别
    		goodsType.add(xiaomiFactor);
    		goodsType.add(huaweiFactor);
    		goodsType.add(pgFactor);
    		
    		goodsType.print();
    	}
    }
    
    
  • 输出

    ------------京东商城商品的类别:数码,描述:在京东上面买的数码一般假货比较少
    ------------京东商城商品的类别的商品厂家:小米厂家,描述:小米手机一般
    小米1
    小米2
    小米3
    ------------京东商城商品的类别的商品厂家:华为厂家,描述:国产手机,农村人最爱
    华为保驰捷1
    华为保驰捷2
    华为保驰捷3
    ------------京东商城商品的类别的商品厂家:苹果厂家,描述:苹果手机,年轻人的热爱
    iphone8
    iphone11
    iphone12
    
    

组合模式在JDK集合的源码分析

public class Composite {

	public static void main(String[] args) {
		
		
		//说明
		//1. Map,AbstractMap就是一个抽象的构建 (类似京东商城)
		//2. HashMap是一个中间的构建(Composite), 实现/继承了相关方法
		//   put, putall 
		//3. Node 是 HashMap的静态内部类,类似Leaf叶子节点, 这里就没有put, putall
		//   static class Node<K,V> implements Map.Entry<K,V>
		
		Map<Integer,String> hashMap=new HashMap<Integer,String>();
		hashMap.put(0, "东游记");//直接存放叶子节点(Node)
		
		Map<Integer,String> map=new HashMap<Integer,String>();
		map.put(1, "西游记");
		map.put(2, "红楼梦"); //..
		hashMap.putAll(map);
		System.out.println(hashMap);

	}

}

组合模式的注意事项和细节

    1. 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
    1. 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.
    1. 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
    1. 需要遍历组织机构,或者处理的对象具有树形结构时, 非常适合使用组合模式.
    1. 要求较高的抽象性, 如果节点和叶子有很多差异性的话 ,比如很多方法和属性都不一样,不适合使用组合模式

Java设计模式(8):组合模式,案例之京东商城

原文:https://www.cnblogs.com/zhugekongan/p/14773910.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!