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

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在设计一个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










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值