目录
- 一、基本介绍
- 合成复用原则的重要性
- 二、应用实例
- 1、示例一
- 2、示例二
一、基本介绍
原则是尽量使用合成/聚合的方式,而不是使用继承
聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开。 可以理解为成员变量和当前类的关系就是聚合关系。
public class A{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->private B b;}
组合关系:也是整体与部分的关系,但是整体与部分不可以分开。也就是假如我创建A类,A类当中有个成员变量是B,而B也会随着A的创建进行实例化,这种叫组合关系。
public class A{ private B b = new B(); }
如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
时刻记住一句话:针对接口编程,而不是针对实现编程
合成复用原则的重要性
- 通常类的复用分为继承复用和合成复用两种,继承python复用虽然有简单和易实现的优点,但它也存在以下缺点。继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
- 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
- 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已android经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
- 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
- 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
- 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
二、应用实例
1、示例一
发现问题 :假如我有一个类为C,他和D类有同样的方http://www.devze.com法update,Test2类难道也要继承C吗?
public class Test2 extends D { public void add() { update(); } } class D { public void update() { } }
2、示例二
去除继js承关系,抽出来一个接口A,将A接口和Test1作为聚合关系,有必要的话也可以改为组合关系。这样一来代码耦合度就降低了,同时代码也变得不是那么死板了。
public class Test1 { private A a; public void add() { a = new B(); a.update(); } } interface A { void update(); } class B implements A { @Override public void update() { } }
到此这篇关于Java设计模式中的设计原则之合成复用原则详解的文章就介绍到这了,更多相关Java合成复用原则内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论