对于面向对象的软件系统而言,如何提高软件的可维护性和可复用性始终是一个核心问题
2013-09-25 18:56
876 查看
故事分析:
“韩信带兵,多多益善”,韩信之所以有很大的影响力,一方面归功他建立了很大的功勋;另外一方面是因为他手握重兵。建立很大的功勋甚至是功高盖主,这就直接导致韩信在军队中深得人心,毕竟,作为士兵,很少有不愿意追随一个在战场上无往不胜的领袖的;手握重兵,有合成聚合的原则来说就是对自己统领的士兵将士保持有引用,就是聚合。韩信手中聚合有一大批能征善战的人,随时听从韩信的调遣,这是不能不让刘邦戒备的。而现在,又说了一个自己带兵多多益善的话,这怎能不让刘邦感觉生气呢?
而“普天之下,莫非王土;四海之内,莫非王臣”,韩信拥有士兵,刘邦却拥有天下,何况韩信也并非拥有全部士兵。“君叫臣死,臣不得不死”,刘邦拥有对天下苍生的生杀大权。韩信很清楚,“陛下虽不善统兵,却善御将”。刘邦是拥有一种比韩信更强的“拥有”关系,可以主宰生死,同时也可以主宰韩信的生死。这就相当于合成关系。更重要的是韩信也是合成关系的一个成员,是刘邦的将领。所以说刘邦比韩信更加强悍!
新建大臣的接口:
public interface Minister{
public void duty();
}
士兵的接口
public interface Soldier{ public void duty(); } |
韩信对大臣接口的实现
public class Hanxin implements Minister{
//对士兵的聚合关系
Soldier[]soldiers;
public Hanxin(){}
public Hanxin(Soldier[]soldiers) {
super();
this.soldiers= soldiers;
}
public void duty(){
System.out.println("我是刘邦的大臣,永远忠实于刘邦");
} }
士兵A对士兵接口的实现
public class SoldierA implements Soldier{ public void duty(){ System.out.println("我是韩信的士兵A"); } } |
士兵B对士兵接口的实现
public class SoldierB implements Soldier{
public void duty(){
System.out.println("我是韩信的士兵B");
} }
刘邦类
public class Liubang{
//拥有大臣
Minister[]minister;
public Liubang(){}
public Liubang(Minister[]minister) {
super();
this.minister= minister;
}
public void duty()
{
System.out.println("我是皇帝,普天之下,莫非王土;四海之内,莫非王臣");
} }
建立一个测试类,代码如下:
public class CARPClient{ public static void main(String[]args) { //声明并实例化士兵A SoldiersoldierA= new SoldierA(); //声明并实例化士兵B SoldiersoldierB= new SoldierB(); //构造士兵数组 Soldier[]soldiers = {soldierA,soldierB}; //声明并实例化韩信,同时传入士兵数组 Ministerhanxin= new Hanxin(soldiers); //构造大臣数组 Minister[]minister = {hanxin}; //声明并实例化刘邦,同时传入大臣数组 Liubangliubang= new Liubang(minister); liubang.duty(); //循环输出大臣 for(Ministeraminister:liubang.getMinister()){ aminister.duty(); } } } |
我是皇帝,普天之下,莫非王土;四海之内,莫非王臣
我是刘邦的大臣,永远忠实于刘邦
已有应用简介:
对于面向对象的软件系统而言,如何提高软件的可维护性和可复用性始终是一个核心问题。合成聚合复用原则的合理而充分的使用时非常有利于构建可维护、可复用、可扩展和灵活性好的软件系统。合成聚合复用原则作为一种构造优质系统的手段几乎可以应用到任何环境中去。对于已有的应用这里就不在赘述啦。
温馨提示:
合成聚合复用原则虽然几乎可以应用到任何环境中去,但是这个原则也有自己的缺点。因为此原则鼓励使用已有的类和对象来构建新的类的对象,这就导致了系统中会有很多的类和对象需要管理和维护,从而增加系统的复杂性。
同时,也不是说在任何环境下使用合成聚合复用原则就是最好的,如果两个类之间在符合分类学的前提下有明显的“IS-A”的关系,而且基类能够抽象出子类的共有的属性和方法,而此时子类有能通过增加父类的属性和方法来扩展基类,那么此时使用继承将是一种更好的选择。
相关文章推荐
- CSDN博客:对于一个程序员,写程序就是实现功能,遇到具体问题,解决这个问题,并记录问题到CSDN上,从而有所提高和互相帮助。
- 如何配置一个软件系统的总体样式(用qss文件)
- logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息
- 如何把自己做好的系统做成一个安装软件
- 如何把一个软件系统搞成saas
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统?
- 讨论一个问题:对于复杂的业务流程Sharepoint如何实现?
- 一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序
- 对于一个管理性的软件来讲,数据主键的产生策略是很关键的一点,这个关系到整个系统的基础架构思想。
- 10K 问题的解决:一个系统管理员如何管理 2000x 台服务器
- 解决一个系统启动过慢问题(软件服务启动错误影响)
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- 如何选择一个合适的邮件系统和邮箱软件?
- 一个典型的后台软件系统的设计复盘——(二)如何id一个事物
- 如何开发一个可复用的软件系统
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统?