java 之 组合模式(大话设计模式)
代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到,
今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮大家理一下这个设计模式的核心思想。
大话设计模式-类图

类图看起来并不复杂,就像一棵大树,枝干上可以有树叶,也可以有分支树干,而分支树干上又可以有树叶...有点拗口,总的来说就是可以不断的扩展下去。
先看下例子,读者不妨把代码拷贝下去跟着断点运行一次,相信会对组合模式有更深刻的认识,然后在自己写个其他的例子,这样就会记住组合模式。先看下笔者的demo
/**
* 抽象公司接口
*/
public abstract class Company { private String name; public Company(String name) {
super();
this.name = name;
} public abstract void add(Company company); public abstract void remove(Company company); public abstract void display(int depth); public abstract void LineOfDuty(); public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
/**
* 具体公司 类似于树干
*/
public class ConcreteCompany extends Company{ private List<Company> children = new ArrayList<>(); public ConcreteCompany(String name) {
super(name);
} @Override
public void add(Company company) {
children.add(company);
} @Override
public void remove(Company company) {
children.remove(company);
} @Override
public void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println(getName());
for (Company company : children) {
company.display(depth + 2);
}
} @Override
public void LineOfDuty() {
for (Company company : children) {
company.LineOfDuty();
}
} }
/**
* 具体部门,类似于树叶
*/
public class HRDepartment extends Company { public HRDepartment(String name) {
super(name);
} @Override
public void add(Company company) { } @Override
public void remove(Company company) { } @Override
public void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println(getName());
} @Override
public void LineOfDuty() {
System.out.println(getName() + "\t员工培训"); } }
/**
* 客户端
*/
public class Test { public static void main(String[] args) {
ConcreteCompany concreteCompany = new ConcreteCompany("北京朝阳公司");
concreteCompany.add(new HRDepartment("北京朝阳公司人力资源部")); ConcreteCompany concreteCompany1 = new ConcreteCompany("上海虹桥公司");
concreteCompany1.add(new HRDepartment("上海虹桥人力资源部"));
concreteCompany.add(concreteCompany1); ConcreteCompany concreteCompany2 = new ConcreteCompany("深圳南山公司");
concreteCompany2.add(new HRDepartment("深圳南山人力资源部"));
concreteCompany1.add(concreteCompany2); concreteCompany.display(1);
concreteCompany.LineOfDuty();
}
}
运行结果:
-北京朝阳公司
---北京朝阳公司人力资源部
---上海虹桥公司
-----上海虹桥人力资源部
-----深圳南山公司
-------深圳南山人力资源部
北京朝阳公司人力资源部 员工培训
上海虹桥人力资源部 员工培训
深圳南山人力资源部 员工培训
跟过断点的读者应该可以理解笔者所说的思想:层层嵌套循环A循环→B循环→C循环...一直把所有的循环全部进行完毕。从对象的角度来看,在循环里不断切换调用同一个方法的对象,直到全部调用完毕
如果还是理解不了,那就多跟几次断点,一次不行就两次。明白原理后在写个遍历文件的例子。
以上是是笔者对组合模式的理解,希望能帮助学习的小伙伴!
java 之 组合模式(大话设计模式)的更多相关文章
- java 之 适配器模式(大话设计模式)
适配器模式,笔者不是很推荐在项目初期阶段使用,在笔者看来这个设计模式就是套接了一层,从而达到能够迎合现有的外部接口规范. 先来简单的看下类图: 大话设计模式-类图 这个模式理解起来非常简单,A→B因为 ...
- java 之 单例模式(大话设计模式)
笔者记得去面试时曾被问起这个模式,当时还没有看过设计模式,对设计模式基本上一无所知,不过可以肯定的是笔者用过单例模式.当时回答的风马牛不相及,很尴尬. 也是从那时起,开始学习设计模式.今天所说的就是单 ...
- java 之 代理模式(大话设计模式)
java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...
- 大话设计模式(C#)
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 问个问题: 如何写出高质量的代码?灵活,可扩展,易读,易维护,可重构,可复用. ...
- JAVA 设计模式 组合模式
用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构
- JAVA设计模式初探之组合模式
先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.” 就拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店, ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java 之 简单工厂模式(大话设计模式)
以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...
随机推荐
- 使用SQL语句时应该注意的一些问题
DECLARE @Where NVARCHAR(max); SET @Where=''; --初始查询条件 SET @Where+=' '; 1.当要对变量使用 "+="时,需要先 ...
- IdentityServer4 配置负载均衡
如果使用 IdentityServer4 做授权服务的负载均衡,默认情况下是不可以的,比如有两个授权服务站点,一个资源服务绑定其中一个授权服务(Authority配置),如果通过另外一个授权服务获取a ...
- js中的浅复制和深复制
浅复制:浅复制是复制引用,复制后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响 深复制:深复制不是简单的复制引用,而是在堆中重新分配内存,并且把源对象实例的所有属性都进行新建复制,以保证深复 ...
- Linux学习(十九)软件安装与卸载(二)更换yum源
一.简介 系统自带的源数量有限,而且是国外的源,速度肯定不如国内的.而断网的时候,本地源就可以派得上用处.而RPMForge源是传说中规模最大的一个源.那么接下来我们就来分别配一下本地源,国内源,RP ...
- Oracle 数据库常用操作语句大全
一.Oracle数据库操作 1.创建数据库 create database databasename 2.删除数据库 drop database dbname 3.备份数据库 完全 ...
- NHibernate 慎用Session.Merge
Session.Merge其意思有两个步骤, 一般用法: Session.Merge(obj); 1. 从当前的Session中获取obj对象, 如果未获取到则从数据库获取. 2. 把程序中的obj的 ...
- Java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. ...
- linux操作系统基础篇(二)
Linux用户.群组.权限 1.用户也是由一个个文件组成的下列文件都是存放用户信息的文件 useradd user1 /etc/passwd: 存放用户信息 /etc/shadow/ :存放用户密码 ...
- 《阿里巴巴Java工作手册》学习笔记
最近浏览了一下阿里巴巴的Java开发手册,感觉内容确实非常的赞,发现了不少自己在编程中的误区,因此决定通过成文牢固掌握,文中将选取个人认为比较重要的部分进行描述与分析."愿站在巨人的肩膀上, ...
- Winform界面中实现通用工具栏按钮的事件处理
在一个给客户做的项目中,界面要求修改增加通用工具栏按钮的事件处理,也就是在主界面中放置几个固定的功能操作按钮,打开不同的页面的时候,实现对应页面的功能处理,这种和我标准的界面处理方式有所不同,标准的列 ...