博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之路-组合模式
阅读量:4166 次
发布时间:2019-05-26

本文共 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:

你可能感兴趣的文章
根据控件ID获取控件
查看>>
ACE篇之四:通过ACE日志策略进行运行时配置
查看>>
ACE篇之五:ACE容器之一(双向链表)
查看>>
ACE篇之六:ACE容器之二(栈)
查看>>
ACE篇之七:ACE容器之三(队列)
查看>>
ACE篇之八:ACE容器之四(数组)
查看>>
ACE篇之九:ACE容器之五(集合)
查看>>
ACE篇之十:ACE容器之六(映射表管理器)
查看>>
ACE篇之十一:ACE容器之七(自调整的二叉树)
查看>>
基本的TCP/IP Socket用法(一)
查看>>
基本的TCP/IP Socket用法(二)
查看>>
处理事件及多个I/O流--ACE Reactor框架总览
查看>>
SIGINT and others
查看>>
vim编程常用命令(随时补充更新)
查看>>
一个简单的makefile示例及其注释
查看>>
python mysql
查看>>
高效人士的八个习惯
查看>>
mysql 赋给用户权限 grant all privileges on
查看>>
读取文件的几种方法
查看>>
yast 创建本地数据源
查看>>