设计模式学习之路-组合模式
2016-09-14 10:32
543 查看
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在设计一个Android开发中,在设计一些对象关系时,总会出现树形结构,权限问题。若是整个树状图没设计好,那么后期很容易崩溃。这个时候组合模式很合适。看看UML类图。
基本代码
根据上图写代码
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;
/**
* 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
基本代码
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
相关文章推荐
- head first 设计模式学习随笔(10)----组合模式
- 设计模式学习之路——Strategy 策略模式
- “设计模式”学习之四:组合(结构型)与迭代器(行为型)
- 设计模式学习笔记——组合模式
- 设计模式学习之路——序
- 设计模式学习之组合模式(Composite)
- java 设计模式 学习笔记(15) 组合模式
- 设计模式学习笔记-组合模式
- 设计模式学习-Composite(组合模式)
- 设计模式入门学习 组合模式
- 设计模式的学习之路,工厂模式加桥模式
- 步步为营 .NET 设计模式学习笔记 十五、Composite(组合模式)
- 设计模式学习之路——Chain Of Responsibility 职责链模式
- 设计模式学习-每日一记(10.组合模式)
- 为什么要学习设计模式(Design Patterns) - 软件设计大师之路
- C#面向对象设计模式学习笔记(8) - Composite 组合模式(结构型模式)
- 设计模式学习之路——Builder 生成器模式
- 面向对象设计模式之Composite组合模式学习笔记
- 设计模式学习之路——factory和abstract factory
- 设计模式学习笔记(组合模式)