组合模式
将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
组合模式让你可以优化处理递归或分级数据结构 .
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,我完成了项目一期的编码";
}
}
外观模式的核心就是把一个业务的完成需要综合了多个类的调用,封装到一个更高层的函数里面。然后把业务完成的内部封装隐藏。返回客户端调用的信息。
分享到:
相关推荐
按照不同的功能特性,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 #### 二、创建型模式 创建型模式主要用于解决对象创建的过程,旨在简化对象创建的复杂度,同时保持对象创建的灵活性。主要...
结构型模式是设计模式的一种类别,它关注如何组合类和对象以创建更复杂的结构。这类模式主要涉及类和对象的组合,分为类模式和对象模式。类模式使用继承来实现,而对象模式则通过对象的关联和聚合来实现。以下是一些...
在本文中,我们将探讨几种结构型设计模式,包括适配器模式、桥接模式、外观模式、享元模式、代理模式和装饰器模式。 1. **适配器模式**: - 适配器模式用于连接两个不兼容的接口,使得原本不能一起工作的类可以...
设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...
适配器模式(Adapter Pattern)是一种结构型设计模式,旨在将一个类的接口转换为客户端期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类能够协同工作。适配器模式通过引入一个适配器类,解决了接口不...
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
JAVA设计模式-原则和23种设计模式归纳总结 ...本资源提供了一份详细的设计模式知识总结,包括设计模式的原则、分类和应用实例。读者可以通过学习和掌握设计模式的知识,提高自己的软件设计和开发能力。
设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...
设计模式是经验丰富的开发者们在解决重复出现的问题时总结出来的一种通用解决方案。它们不是具体的代码或库,而是对如何设计可扩展、可维护和灵活的软件结构的一种描述。设计模式通常分为三类:创建型、结构型和行为...
Java设计模式是软件工程中的一种重要思想,它总结了在解决特定问题时,程序员们反复使用的一些最佳实践和解决方案。这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者...
设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...
2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...
设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的经验和方法,为软件设计提供了一种标准化的解决方案。本书旨在帮助C#开发者更好地理解和运用这些模式,提升代码质量和可维护性。 设计模式...
设计模式(创建型、结构型、行为型) 设计模式是软件设计中的一种重要概念,它们可以帮助开发者更好地设计和实现软件系统。根据GoF(Gang of Four)的分类,设计模式可以分为三大类:创建型、结构型和行为型。 ...
本篇文章将对一系列重要的C#面向对象设计模式进行总结,帮助开发者更好地理解和应用这些模式。 1. 工厂模式:工厂模式是一种创建型设计模式,提供了一种创建对象的最佳方式,通过抽象工厂接口,避免了代码与具体类...
设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...