您的位置:首页 > 移动开发 > Android开发

设计模式学习之路-组合模式

2016-09-14 10:32 543 查看
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在设计一个Android开发中,在设计一些对象关系时,总会出现树形结构,权限问题。若是整个树状图没设计好,那么后期很容易崩溃。这个时候组合模式很合适。看看UML类图。



基本代码

abstract class Component{
protected String name;

public Component(String name){
this.name = name;
}

public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Dispaly(int depth);
}
class Leaf extends Component{
public Leaf(String name){
super(name);
}

@Override
public void Display(int depth){
//显示
}
}
class Composite extends Component{
private List<Component>cs = new ArrayList<Component>();
@Override
public void Add(Component c){
cs.add(c);
}
@Override
public void Remove(Component c){
cs.remove(c);
}

@Override
public void Display(int depth){
cs.get(depth).toString();
}
}
客户端

static void main(String[] args){
Composite root = new Composite("root");
root.add(new Leaf("Leaf_1"));
root.add(new Composite("composite_1"));

}
这就构建成了一个小的树状图。这种树状图在一些大公司非常常见,大公司有很多分公司,每个分公司属于总部管理。每个分部有自己的人事部和财务部。那么这样基本的树形结构就出来。我先画出来看看。



根据上图写代码

package com.abings.compositemodel.CompositeModel;

import android.util.Log;

/**
* Created by HaomingXu on 2016/9/14.
*/
public abstract class Component {
public String name;
public String zhize;
public int level;

public Component(String name,int level){
this.name = name;
this.level = level;
}
public abstract void dispaly(int depth);
public abstract void LineOfDuty();
public void show(){
Log.i("Tag", "第" + level + "层:" + name);
}
}
我个人觉得,叶的部分既然不能修改,那么它就不应该有增加和删除的方法,那么就把增加删除的方法抽象出来成为接口。
package com.abings.compositemodel.CompositeModel;

/**
* Created by HaomingXu on 2016/9/14.
*/
public interface Componey {
void add(Component c);
void remove(Component c);
}
package com.abings.compositemodel.CompositeModel;

import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
* Created by HaomingXu on 2016/9/14.
*/
public class Composite extends Component implements Componey {

private List<Component>cs = new ArrayList<>();

public Composite(String name, int level) {
super(name, level);
}

@Override
public void dispaly(int depth) {
for (int i = 0; i < cs.size(); i++) {
cs.get(i).show();
cs.get(i).dispaly(depth);
}
}

@Override
public void LineOfDuty() {
Log.i("Tag", this.name+"\n");
}

@Override
public void add(Component c) {
cs.add(c);
}

@Override
public void remove(Component c) {
cs.remove(c);
}
}
财务部
package com.abings.compositemodel.CompositeModel;

import android.util.Log;

/**
* Created by HaomingXu on 2016/9/14.
*/
public class FinanceDepartment extends Component {

public FinanceDepartment(String name, int level) {
super(name, level);
}

@Override
public void dispaly(int depth) {
}

@Override
public void LineOfDuty() {
Log.i("Tag", this.name + " 公司财务收支管理");
}
}
人力资源部
package com.abings.compositemodel.CompositeModel;

import android.util.Log;

/**
* Created by HaomingXu on 2016/9/14.
*/
public class HRDepartment extends Component {

public HRDepartment(String name, int level) {
super(name, level);
}

@Override
public void dispaly(int depth) {
}

@Override
public void LineOfDuty() {
Log.i("Tag",this.name+" 员工招聘培训管理");
}
}
客户端源码
package com.abings.compositemodel;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.abings.compositemodel.CompositeModel.Composite;
import com.abings.compositemodel.CompositeModel.FinanceDepartment;
import com.abings.compositemodel.CompositeModel.HRDepartment;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Composite root = new Composite("北京总公司",0);
root.add(new HRDepartment("北京总公司人力资源部",1));
root.add(new FinanceDepartment("北京总公司财务部",1));

Composite comp_1 = new Composite("上海华东分公司",1);
comp_1.add(new HRDepartment("华东分公司人力资源部",2));
comp_1.add(new FinanceDepartment("华东分公司财务部",2));
root.add(comp_1);

Composite comp_2 = new Composite("南京办事处",2);
comp_2.add(new FinanceDepartment("南京办事处财务部",3));
comp_2.add(new HRDepartment("南京办事处人力资源部",3));
comp_1.add(comp_2);

Composite comp_3 = new Composite("杭州办事处",2);
comp_3.add(new HRDepartment("杭州办事处人力资源部",3));
comp_3.add(new FinanceDepartment("杭州办事处财务部",3));
comp_1.add(comp_3);

//显示结构
root.show();
root.dispaly(0);

}
}
运行结果:
09-14 16:12:50.383 32075-32075/? I/Tag: 第0层:北京总公司
09-14 16:12:50.383 32075-32075/? I/Tag: 第1层:北京总公司人力资源部
09-14 16:12:50.383 32075-32075/? I/Tag: 第1层:北京总公司财务部
09-14 16:12:50.383 32075-32075/? I/Tag: 第1层:上海华东分公司
09-14 16:12:50.383 32075-32075/? I/Tag: 第2层:华东分公司人力资源部
09-14 16:12:50.383 32075-32075/? I/Tag: 第2层:华东分公司财务部
09-14 16:12:50.383 32075-32075/? I/Tag: 第2层:南京办事处
09-14 16:12:50.383 32075-32075/? I/Tag: 第3层:南京办事处财务部
09-14 16:12:50.383 32075-32075/? I/Tag: 第3层:南京办事处人力资源部
09-14 16:12:50.383 32075-32075/? I/Tag: 第2层:杭州办事处
09-14 16:12:50.383 32075-32075/? I/Tag: 第3层:杭州办事处人力资源部
09-14 16:12:50.383 32075-32075/? I/Tag: 第3层:杭州办事处财务部
当然这只是简单的运用,一个模子。在实际开发过程中,可以用这种模式来设计树形结构。管理权限等等。具体使用要看具体的需求了。活学活用,才是一个好的学习习惯。
git:https://github.com/SingleShu/CompositeModel
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息