㈠意图:java
Composite(组合)模式属于对象结构型模式.它将对象组合成树形结构以表示"部分-总体"的层次结构.Composite使得用户对单个对象和组合对象的使用具备一致性.算法
㈡实例:ide
考虑一个七巧板的拼图游戏.测试
通常所提供的基本图形:三角形和方形.咱们使用这两类基本图形按照图纸能够拼接成许多不一样的组合图形;spa
若是按照正常的对象结构模式.当咱们每要拼接一个新的图形时,咱们都须要为它建立一个新的对象(类).这个组合对象至关于一个容器;里面按照算法和属性组合了这些基本图形.对象
然而这种方法存在一个问题:使用这些类的代码必须区别基本图形和组合图形.没法用统一的方式去使用基本图形和组合图形.游戏
而使用composite模式则能够很好地解决这个问题;结构以下: rem
对应的结构:get
㈢UML图:string
㈣场景对照:
Component:抽象的Graph类;定义抽象的共有操做而且提供了管理组合不一样组件的方法;让子类进行Override.
Leaf: 对应Rectangle和Triangle;
Composite: 对应组合后的House图形;
㈤代码实现:
- /**
- * Composite模式中的抽象Component
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public abstract class Graph
- {
- public abstract void draw();
- public void addGraph(Graph g)
- {
- }
- public void removeGraph(Graph g)
- {
- }
- public Graph getChild(int i)
- {
- return null;
- }
- }
- /**
- * Composite模式中的Leaf Component
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Triangle extends Graph
- {
- @Override
- public void draw()
- {
- System.out.println("draw a triangle ~!");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Rectangle extends Graph
- {
- public void draw()
- {
- System.out.println("print a rectangle !");
- }
- }
- /**
- * 测试类
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Client
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- Graph t = new Triangle();
- Graph r = new Rectangle();
- House h = new House();
- h.addGraph(t);
- h.addGraph(r);
- h.draw();
- }
- }
- /**
- * Composite模式中的Component类
- */
- package com.skywares.designpattern.composite;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author Administrator
- *
- */
- public class House extends Graph
- {
- private List<Graph> graphList = new ArrayList();
- @Override
- public void draw()
- {
- if(graphList != null && graphList.size() == 2)
- {
- for(Graph g : graphList)
- {
- g.draw();
- }
- }
- }
- @Override
- public void addGraph(Graph g)
- {
- graphList.add(g);
- }
- @Override
- public void removeGraph(Graph g)
- {
- graphList.remove(g);
- }
- /* (non-Javadoc)
- * @see com.skywares.designpattern.composite.Graph#getChild(int)
- */
- @Override
- public Graph getChild(int i)
- {
- return graphList.get(i);
- }
- }
这样之后即便要扩展其它图形;咱们也只须要重写它的draw()方法和相应的增长元素的方法便可;而在客户端调用画图形的方法是不须要更改的;