今天给大家带来的是设计模式的前身,写项目的时候,完成功能模块是最基本的需求,而如何将代码写的更优雅,能适应未来需求的不断变更过,具有极高的可维护性和扩展性,这就是编程的艺术了。
组合
什么叫做组合?一句话描述:将一个已有的对象引用置于一个新类中。
组合是一种较弱的关系,是has-a的关系。
看下面代码:
public class Animal {
private void beat(){
System.out.println("心脏跳动...");
}
public void breath(){
beat();
System.out.println("呼吸中...");
}
}
public class Bird {
//将Animal作为Bird的成员变量
private Animal a;
public Bird(Animal a){
this.a = a;
}
public void breath(){
a.breath();
}
public void fly(){
System.out.println("我在飞..");
}
public static void main(String[] args){
Animal animal = new Animal();
Bird b = new Bird(animal);
b.breath();
b.fly();
}
}
继承
Java的继承具有单继承的特点:每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。
public class Fruit {
//成员变量
public double weight;
public void info(){
System.out.println("我是一个水果!重" + weight + "g!");
}
}
public class Apple extends Fruit {
public static void main(String[] args){
Apple a = new Apple();
a.weight = 10;
a.info();
}
}
组合和继承的对比
-
继承结构,子类可以获得父类内部实现细节,破坏封装。组合结构,整体不能看到部分的内部实现细节,不会破坏封装
-
继承结构中,子类可以回溯父类,直到Object类,这样就可以根据业务实现多态(向上转型和向下转型) ,组合中不可以实现多态
如何选择
-
两个类之间,明显的存在整体和部分的关系,则应该使用组合来实现复用。当我们需要对已有类做一番改造,从而得到新的符合需求的类,则应该使用继承。
-
当需要被复用的类一定不会改变时,应该使用组合,否则,应该使用继承。