本文共 5300 字,大约阅读时间需要 17 分钟。
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在设计一个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客户端cs = new ArrayList (); @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财务部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: