`
biqing0427
  • 浏览: 57295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

我工作的那点事--学习《设计模式》实例应用(composite模式)

阅读更多
早上一到公司就看到德国那边的新需求,唉,没办法我们睡觉做着美梦的时候,那边正在想着让我们怎么工作充实呢。别人安排完了睡觉,我们醒来就要完成别人想的,没有办法,工作嘛,就这样了……

德国那边通常会把一个项目给我们中国这边的一个经理,然后经理安排developers开发各自的模块,然后最后自己组装各个模块,形成产品。德国那边不管我们怎么分工的,最后他们只要成品的。

这种工作模式 其实有点像builder的,各个模块分开,最后组装。不过今天这里我想用下composite模式。

1.组件:Component 一个工作组

public abstract class Component {
public abstract int add(int a[]);//假设产品加的功能

public abstract int del(int a[]);//假设产品减的功能

public abstract int mul(int a[]);//假设产品乘的功能

public void addComponent(Component comp) {
};//负责增加小组成员

public void removeComponent(Component comp) {
};//负责减少小组成员

public Component getChildComponent(int i) {
  return null;
};//得到小组成员,这样可以直接和他进行对话
}


2.项目经理:Composite 负责组装 和 德国的交互
import java.util.ArrayList;
import java.util.List;

public class Composite {

List leaf = new ArrayList();

//组装加的功能
public int add(int a[]){
  int iResult = 0;
  for(int i=0;i<leaf.size();i++){
    iResult +=((Component)leaf.get(i)).add(a);
  }
  return iResult;
};

//组装减的功能
public int del(int a[]){
  int iResult = 0;
  for(int i=0;i<leaf.size();i++){
    iResult +=((Component)leaf.get(i)).del(a);
  }
  return iResult;
};

//组装乘的功能
public int mul(int a[]){
  int iResult = 0;
  for(int i=0;i<leaf.size();i++){
    iResult +=((Component)leaf.get(i)).mul(a);
  }
  return iResult;
};

//增加小组成员
public void addComponent(Component comp) {
  leaf.add(comp);
};

//减少小组成员
public void removeComponent(Component comp) {
  int i = leaf.indexOf(comp);
  if(i>=0){
  leaf.remove(i);
  }
};

//提供德国那边直接和某个成员直接交互
public Component getChildComponent(int i) {
   Component comp = null;
   if(leaf.size()>0&&i<leaf.size()){
     comp = (Component)leaf.get(i);
   }
   return comp;
};
}

3.小组成员A,B,C,D
//小组成员A
public class LeafA extends Component {

public int add(int a[]) {
  int iResult = 0;
  for (int i = 0; i < a.length; i++) {
    iResult += a[i];
  }
  System.out.println("call leafA.add()");
  return iResult;
}

public int del(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
     iResult = a[i] - iResult;
   }
   System.out.println("call leafA.del()");
   return iResult;
}

public int mul(int a[]) {
   int iResult = 1;
   for (int i = 0; i < a.length; i++) {
     iResult = iResult * a[i];
   }
   System.out.println("call leafA.mul()");
   return iResult;
}
}

//小组成员B
public class LeafB extends Component {

public int add(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
     iResult += a[i];
   }
   System.out.println("call leafB.add()");
   return iResult * 2;
}

public int del(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
     iResult = a[i] - iResult;
   }
   System.out.println("call leafB.del()");
   return iResult * 2;
}

public int mul(int a[]) {
   int iResult = 1;
   for (int i = 0; i < a.length; i++) {
     iResult = iResult * a[i];
   }
   System.out.println("call leafB.mul()");
   return iResult * 2;
}
}

//小组成员C
public class LeafC extends Component {

public int add(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
      iResult += a[i];
   }
   System.out.println("call leafC.add()");
   return iResult * 3;
}

public int del(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
      iResult = a[i] - iResult;
   }
   System.out.println("call leafC.del()");
   return iResult * 3;
}

public int mul(int a[]) {
   int iResult = 1;
   for (int i = 0; i < a.length; i++) {
       iResult = iResult * a[i];
   }
   System.out.println("call leafC.mul()");
   return iResult * 3;
}
}

//小组成员D
public class LeafD extends Component {

public int add(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
      iResult += a[i];
   }
   System.out.println("call leafD.add()");
   return iResult * 4;
}

public int del(int a[]) {
   int iResult = 0;
   for (int i = 0; i < a.length; i++) {
      iResult = a[i] - iResult;
   }
   System.out.println("call leafD.del()");
   return iResult * 4;
}

public int mul(int a[]) {
   int iResult = 1;
   for (int i = 0; i < a.length; i++) {
      iResult = iResult * a[i];
   }
   System.out.println("call leafD.mul()");
   return iResult * 4;
}
}


4.看看整个过程吧:
public void testComposite() {

Composite composite = new Composite();//任命项目经理
LeafA leafA = new LeafA();//成员A
LeafB leafB = new LeafB();//成员B
LeafC leafC = new LeafC();//成员C
LeafD leafD = new LeafD();//成员D

composite.addComponent(leafA);//将A加入项目
composite.addComponent(leafB);//将A加入项目
composite.addComponent(leafC);//将A加入项目
composite.addComponent(leafD);//将A加入项目
int a[] = {1,2,3,4,5,6,7,8,9};

//composite.add(a);德国要求得到加的功能
System.out.println("composite.add(a):"+composite.add(a));

//composite.del(a);德国要求得到减的功能
System.out.println("composite.del(a):"+composite.del(a));

//composite.mul(a);德国要求得到乘的功能
System.out.println("composite.mul(a):"+composite.mul(a));

composite.removeComponent(leafA);

//composite.add(a);LeafA 离职了
System.out.println("composite removes leafA");
System.out.println("composite.add(a):"+composite.add(a));

//composite.del(a);
System.out.println("composite.del(a):"+composite.del(a));

//composite.mul(a);
System.out.println("composite.mul(a):"+composite.mul(a));

//composite.add(a);德国那边要求详细看看B的工作情况
LeafB b = (LeafB)composite.getChildComponent(0);

System.out.println("directly ask leafB");
System.out.println("composite.add(a):"+b.add(a));

//composite.del(a);
System.out.println("composite.del(a):"+b.del(a));

//composite.mul(a);
System.out.println("composite.mul(a):"+b.mul(a));
}


结果如下:

call leafA.add()
call leafB.add()
call leafC.add()
call leafD.add()
composite.add(a):450
call leafA.del()
call leafB.del()
call leafC.del()
call leafD.del()
composite.del(a):50
call leafA.mul()
call leafB.mul()
call leafC.mul()
call leafD.mul()
composite.mul(a):3628800
composite removes leafA
call leafB.add()
call leafC.add()
call leafD.add()
composite.add(a):405
call leafB.del()
call leafC.del()
call leafD.del()
composite.del(a):45
call leafB.mul()
call leafC.mul()
call leafD.mul()
composite.mul(a):3265920
directly ask leafB
call leafB.add()
composite.add(a):90
call leafB.del()
composite.del(a):10
call leafB.mul()
composite.mul(a):725760
分享到:
评论

相关推荐

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    设计模式的学习不仅是为了记住每种模式的应用场景,更重要的是理解其背后的原理和设计理念。通过深入学习和实践,开发者可以逐渐掌握这些模式,并将其内化为自己的设计思维。设计模式的学习过程虽然漫长且充满挑战,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它提供了一种解决常见问题的方法论。GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    通过学习和掌握GoF的23种设计模式,可以显著提高程序员的编码水平,使得开发出的软件系统更加健壮、可扩展、易维护。以上每种模式都有其特定的应用场景,理解和掌握它们的关键在于不断实践和总结,在实际项目中灵活...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码

    ### 设计模式精解—GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式作为一种重要的面向对象设计工具,在软件开发中扮演着至关重要的角色。本文旨在深入解析GoF(Gang of Four,四人组)提出的23种设计...

    设计模式精解-GoF23种设计模式解析附C++实现源码

    C++实现源码提供了具体编程环境下的应用实例,帮助读者更好地理解和应用这些设计模式。通过阅读和实践这些源码,开发者可以更深入地掌握如何在实际项目中灵活运用设计模式,提升代码质量和可维护性。

    设计模式精解-GoF 23种设计模式解析

    设计模式的学习和应用分为几个阶段:首先自己学会设计模式,然后将其转化为自己的语言表达出来,接着是教授他人并最终记录下来。这种学习路径要求学习者不仅要理解设计模式本身,还要具备清晰的表达能力和深刻的理解...

    设计模式实例代码

    在本案例中,我们聚焦于C#语言中的设计模式,通过"设计模式实例代码"这个项目,我们可以深入理解并学习这些模式的实际应用。 "设计模式"标签表明了这个压缩包的内容主要围绕设计模式展开,涵盖了面向对象设计的核心...

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

    java设计模式实例

    Java设计模式是面向对象编程中的重要概念,它们是软件开发过程中经过反复验证并总结出的最佳实践,用于解决常见...在阅读和实践这些Java设计模式实例时,要注意理解每个模式的核心思想,以及如何在实际项目中灵活运用。

    设计模式精解-GoF 23种设计模式解析附

    通过学习设计模式,我们可以更好地组织代码结构,提高软件质量,同时减少开发过程中的重复工作。本文将详细介绍GoF提出的23种设计模式,并提供C++实现示例,帮助读者深入理解这些模式的应用场景和技术细节。 #### ...

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    设计模式PPT---25种设计模式详解

    这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对25种主要的设计模式进行了详尽的阐述。 首先,我们要理解设计模式的基本概念。设计模式不是代码,而是一种...

Global site tag (gtag.js) - Google Analytics