您的位置:首页 > 其它

设计模式--组合模式Composite(结构型)

2016-12-28 15:32 495 查看
一、概念

组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

二、UML图



1.Component(对象接口),定义了对象可以做的事情。

2.Leaf(叶子结点对象)

3.Composite(其他结点对象,包含其他结点或者叶子节点)

三、例子

快递公司一般都有层级结构



/**
* 顺丰公司抽象类
* 定义了公司可以做哪些事情
* @author eason
*
*/
public abstract class SFCompany {

//公司名
protected String name;
//公司级别
protected int grade;

public SFCompany(String name, int grade) {
this.name = name;
this.grade = grade;
}

//添加一个下属公司
public abstract void add(SFCompany sf);
//删除一个下属公司
public abstract void remove(SFCompany sf);
//打印自己
public void display() {
for(int i=1; i<=grade; i++) {
System.out.print("-----");
}
System.out.println(name);
}

}

/**
* 最下层的公司
* @author eason
*
*/
public class SFTailCompany extends SFCompany{

public SFTailCompany(String name, int grade) {
super(name, grade);
}

@Override
public void add(SFCompany sf) {
throw new UnsupportedOperationException();
}

@Override
public void remove(SFCompany sf) {
throw new UnsupportedOperationException();
}

//  已经提到父类中
//    @Override
//    public void display() {
//        for(int i=1; i<=grade; i++) {
//            System.out.print("-----");
//        }
//        System.out.println(name);
//    }
}

/**
* 有下属公司的顺丰公司
* @author eason
*
*/
public class SFHeadCompany extends SFCompany{
//保存下属公司
private List<SFCompany> sfCompanys = new ArrayList<SFCompany>();

public SFHeadCompany(String name, int grade) {
super(name, grade);
}

@Override
public void add(SFCompany sf) {
sfCompanys.add(sf);
}

@Override
public void remove(SFCompany sf) {
sfCompanys.remove(sf);
}

//先打印自己,在打印自己的下属
@Override
public void display() {
//  已经提到父类中,用super.display();代替
//        for(int i=1; i<=grade; i++) {
//            System.out.print("-----");
//        }
//        System.out.println(name);
super.display();
for(SFCompany sf : sfCompanys) {
sf.display();
}
}

}

/**
* 测试类
* @author eason
*
*/
public class TestCompostite {

public static void main(String[] args) {
SFCompany head = new SFHeadCompany("总公司", 1);
SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2);
SFCompany wuhan = new SFHeadCompany("武汉分公司", 2);
SFCompany beijing = new SFHeadCompany("北京分公司", 2);
SFCompany wuchang = new SFHeadCompany("武昌分公司", 3);
SFCompany baoan = new SFHeadCompany("宝安分公司", 3);
SFCompany luohu = new SFHeadCompany("罗湖分公司", 3);
SFCompany nanshan = new SFHeadCompany("南山分公司", 3);

head.add(shenzhen);
head.add(wuhan);
head.add(beijing);

wuhan.add(wuchang);

shenzhen.add(baoan);
shenzhen.add(luohu);
shenzhen.add(nanshan);
//移除武汉
//head.remove(wuhan);

head.display();

}

}


四、使用场景

1.需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。

2.组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: