组合模式
将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
组合模式让你可以优化处理递归或分级数据结构 .
package com.ruishenh.designPatter.structure.composite;
import java.util.ArrayList;
import java.util.List;
public class CompositeClient {
public static void main(String[] args) {
AbstractCompany department =new ConcreteDepartment("研发部");
ConcreteDepartment d1 =new ConcreteDepartment("研发部一级");
d1.addPos(new Position("总监", 1));
d1.addPos(new Position("高级经理", 2));
d1.addPos(new Position("经理", 3));
d1.addPos(new Position("主管", 4));
department.add(d1);
EndDepartment ed1=new EndDepartment("集成组");
ed1.addPos(new Position("组长", 5));
ed1.addPos(new Position("副组长", 6));
department.add(ed1);
d1.add(ed1);
department.operate(1);
}
}
//公司机构
abstract class AbstractCompany{
abstract int add(AbstractCompany company);
abstract int remove(AbstractCompany company);
abstract Object operate(int depth);
abstract AbstractCompany getChild(int index);
}
//具体机构部门
class ConcreteDepartment extends AbstractCompany{
String name;
public ConcreteDepartment(String name) {
super();
this.name = name;
}
List<Position> pos=new ArrayList<Position>();
protected List<AbstractCompany> departments=new ArrayList<AbstractCompany>();
@Override
int add(AbstractCompany company) {
departments.add(company);
return 0;
}
@Override
int remove(AbstractCompany company) {
departments.remove(company);
return 0;
}
@Override
AbstractCompany getChild(int index) {
return departments.get(index);
}
void addPos(Position e){
this.pos.add(e);
}
void removePos(Position e){
this.pos.remove(e);
}
void displayPosition(int depth){
for (Position p : pos) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println("职位名称:"+p.getName()+",职位级别:"+p.getGrade());
}
};
@Override
Object operate(int depth) {
System.out.println(depth+"级部门:"+this.name);
displayPosition(depth);
for (AbstractCompany depart : departments) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
depart.operate(depth+1);
}
return null;
}
}
//末端部门
class EndDepartment extends AbstractCompany{
public EndDepartment(String name) {
this.name = name;
}
String name;
List<Position> pos=new ArrayList<Position>();
@Override
int add(AbstractCompany company) {
System.out.println("已经是最后子级部门,不能添加子部门");
return -1;
}
@Override
int remove(AbstractCompany company) {
System.out.println("已经是最后子级部门,没有子部门了");
return -1;
}
@Override
Object operate(int depth) {
System.out.println(depth+"级部门:"+this.name);
displayPosition(depth);
return null;
}
@Override
AbstractCompany getChild(int index) {
return null;
}
void addPos(Position e){
this.pos.add(e);
}
void removePos(Position e){
this.pos.remove(e);
}
void displayPosition(int depth){
for (Position p : pos) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
System.out.println("职位名称:"+p.getName()+",职位级别:"+p.getGrade());
}
};
}
//公司职位
class Position{
public Position(String name, int grade) {
super();
this.name = name;
this.grade = grade;
}
String name;
int grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
组合模式核心任务是将客户端操作复杂的容器和简单的容器操作能力一样,造成层级化的操作,显得单一简单。
一般使用在一些需要层级化的操作实例中,比如文件夹和子文件系列等。
外观模式
又叫门面模式,为子系统中的一组接口提供一致的界面,提供了一高层接口,这个接口使得子系统更容易使用。
package com.ruishenh.designPatter.structure.facode;
import java.util.ArrayList;
import java.util.List;
public class FacodeClient {
public static void main(String[] args) {
CTO cto =new CTO();//总监来了
Manager m =new Manager();//问经理要最近工作情况
//总监看经理提供的报表
cto.lookReport(m.getReport());
}
}
class CTO{
void lookReport(List<String> msg){
for (String string : msg) {
System.out.println(string);
}
}
}
class Manager{
List<String> getReport(){
List<String> list=new ArrayList<String>();
Staff1 s1=new Staff1();
Staff2 s2=new Staff2();
Staff3 s3=new Staff3();
list.add(s1.worked());
list.add(s2.worked());
list.add(s3.worked());
return list;
}
}
//员工一
class Staff1{
String worked(){
return "我是小A,我完成了项目一期的设计";
}
}
//员工二
class Staff2{
String worked(){
return "我是小D,我完成了项目一期的UI";
}
}
//员工三
class Staff3{
String worked(){
return "我是小G,我完成了项目一期的编码";
}
}
外观模式的核心就是把一个业务的完成需要综合了多个类的调用,封装到一个更高层的函数里面。然后把业务完成的内部封装隐藏。返回客户端调用的信息。
分享到:
相关推荐
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读 行为型模式 备忘录模式 +结构型模式 创建型模式总结 +创建型模式
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
全书共9章,内容包括设计模式基础、创建型设计模式(共5种)、结构型设计模式(共7种)、行为型设计模式(共11种)、设计模式实验指导。每章包括教学目标、重点内容、模式的定义与特点、模式的结构与实现、模式的...
具体地, 研究了源码中设计模式抽取的静态结构分析过程, 为了进一步提高设计模式实例抽取的准确率, 对结构分析得到的创建型模式候选, 使用创建对象的多重性分析方法进行验证, 对结构分析得到的行为型模式候选, 使用...
内容简介:本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。 本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境...
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计...
(1)上篇:软件设计模式例子代码 【例2.2】简单工厂方法模式-汽车保险 【例2.3】工厂方法模式-汽车保险 【例2.4】抽象工厂模式-房屋信息 【例2.5】生成器模式-房屋信息 【例2.6】单例模式-互联网...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...
采用同一套网店模板的网店除了里面所展示的内容不一样以外,网店的风格样式几乎一致,除了一些定制化的功能,比如logo等,请使用享元模式来模拟此问题,绘制享元模式类图,并绘制该实例的类图,并编写代码演示结果。
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
JAVA的23种设计模式实例,如三大类创建型模式、结构型模式、行为型模式,细分为23种具体模式1. 设计模式 3 1.1 创建型模式 4 1.1.1 工厂方法 4 1.1.2 抽象工厂 6 1.1.3 建造者模式 10 1.1.4 单态模式 13 1.1.5 原型...
这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...
内容简介:本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下...
创建型设计模式主要“关注对象的创建”。 1. 单例模式 单例模式:能不用就不用 ,他的目的就是为了让一个类只创建一个实例。 用法:把对象的创建权限关闭,提供一个人公开的静态方法,实现静态方法后将实例存放于...
第4章结构型模式实训 4.1知识讲解 4.1.1结构型模式概述 4.1.2适配器模式 4.1.3桥接模式 4.1.4组合模式 4.1.5装饰模式 4.1.6外观模式 4.1.7享元模式 4.1.8代理模式 4.2实训实例 4.2.1适配器模式实例之算法...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...