举例
1.例子
代码
1.公司组件
/**抽象构件,组合模式的精髓
* Created by Administrator on 2019/4/22.
*/
public abstract class Corp {
private String name;
private String position;
private Integer salary;
public Corp(String name, String position, Integer salary) {
this.name = name;
this.position = position;
this.salary = salary;
}
public String getInfo() {
return toString();
}
2.树枝组件
/**树枝节点
* Created by Administrator on 2019/4/22.
*/
public class Branch extends Corp {
private ArrayList<Corp> arrayList=new ArrayList<Corp>();
public void add(Corp corp){
arrayList.add(corp);
}
public ArrayList<Corp> getArrayList() {
return arrayList;
}
public Branch(String name, String position, Integer salary) {
super(name, position, salary);
}
}
3.叶子组件
/**
* Created by Administrator on 2019/4/22.
* 叶子节点
*/
public class Leaf extends Corp {
public Leaf(String name, String position, Integer salary) {
super(name, position, salary);
}
}
4.场景类
/**组合模式
* 优势
* 1.高层模块调用更加轻松,
* 2.增加、删除子节点更加方便、非常容易扩展、符合开闭原则,易于维护和扩展。
* 问题:
* 1:不符合依赖倒置原则
* 2,不是面向接口编程,很不恰当,用的时候参考是否限制了接口的影响范围
* 适用场景:
* 1.树形结构,局部和整体的结构中,可以用此类结构进行编写,一定要用此结构
* Created by Administrator on 2019/4/22.
*/
public class Cilent {
public static void main(String[]args){
Branch root=new Branch("老王","总经理",10000);
Branch branch=new Branch("老张","销售部部总经理",8000);
Leaf leaf=new Leaf("老刘","销售员工",5000);
branch.add(leaf);
root.add(branch);
System.out.println(display(root));
}
//默认前序遍历,给一个根节点,便可以遍历整棵树。
public static String display(Branch root){
ArrayList<Corp> arrayList = root.getArrayList();
String info=root.getInfo();
for(Corp corp:arrayList){
if(corp instanceof Leaf){
//返回一个完整的树的信息
info=info+corp.getInfo();
}else {
info=info+display((Branch)corp);
}
}
return info;
}
}
5、运行结果
name='老王', position='总经理', salary=10000name='老张', position='销售部部总经理', salary=8000name='老刘', position='销售员工', salary=5000
模式说明
含义:
组合模式又叫部分整体模式
角色
1.抽象构件角色:组合模式的精髓,定义参加组合模式对象的共有属性和方法,可以定义一些默认的属性和方法,如上例子中的getInfo().
2.叶子构件:叶子对象,下面再没有其它分支,遍历的最小单位
3.树枝构件:叶子节点,左右是组合叶子结点和树枝节点形成一个树形结构。
通用代码
1.抽象构件
/**抽象构件类
* Created by Administrator on 2019/4/25.
*/
public class Component {
public void doSomething(){
}
}
2.树枝节点
/**树枝节点
* Created by Administrator on 2019/4/22.
*/
public class Composite extends Component {
private List<Component> subCompositeList=new ArrayList<Component>();
public void add(Component component){
subCompositeList.add(component);
}
public void remove(Component component){
subCompositeList.remove(component);
}
public List<Component> getSubCompositeList(){
return subCompositeList;
}
}
3.叶子结点
/**树叶节点
* Created by Administrator on 2019/4/22.
*/
public class Leaf extends Component {
@Override
public void doSomething() {
super.doSomething();
}
}
使用场景
1.对于树形结构,一定要考虑使用组合模式
2.对于部分整体的结构,并且这种结构比较深的时候,需要考虑使用组合模式。
优势
1.高层模块调用简单,无论是叶子组件还是树枝组件,对于高层来说都是构件,高层不需要知道是什么构件,统一只有一个Component组件,这样高层模块调用起来会非常简单。
2.增加、删除子节点非常容易,符合开闭原则,易于维护和扩展
劣势
1.组合模式组件类用的都是实现类,违背了依赖倒置原则,并且不符合面向接口编程,写的时候需要考虑此模式限制了接口的影响范围。
扩展
安全模式:
前面的例子为安全模式
透明模式:
1.类图:
2.说明:将对子节点的增删改查放入抽象组件中,通过getChild()返回是否为空来判断是叶子结点还是树枝节点,这样在运行期会有问题。
3.代码:
1.抽象组件
/**
* Created by Administrator on 2019/4/28.
*/
public abstract class Component {
protected List<Component> subCompositeList=new ArrayList<Component>();
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract List<Component> getSubCompositeList();
public void doSomething(){
};
}
2.树枝节点
/**
* Created by Administrator on 2019/4/28.
*/
public class Composite extends Component {
public void add(Component component){
subCompositeList.add(component);
}
public void remove(Component component){
subCompositeList.remove(component);
}
@Override
public List<Component> getSubCompositeList() {
return subCompositeList;
}
}
3,叶子结点
/**
*
* Created by Administrator on 2019/4/28.
*/
public class Leaf extends Component {
@Override
public void add(Component component) throws UnsupportedOperationException{
//直接跑出不支持请求的类
throw new UnsupportedOperationException();
}
@Override
public void remove(Component component) throws UnsupportedOperationException{
throw new UnsupportedOperationException();
}
@Override
public List<Component> getSubCompositeList() throws UnsupportedOperationException{
throw new UnsupportedOperationException();
}
}
网友评论