OO原则:封装、继承、多态
封装:隐藏类的内部实现机制,在不影响使用者的前提下改变内部结构,同时保护了数据
继承:可以使得好东西多次被利用,同时为多态做准备
多态:方法重写、重载、动态连接构成多态性。
背景:
我们设计父类Duck并实现各种方法(如游泳swim(),呱呱叫quack(),外貌dispaly()),每个鸭子都会继承Duck来实现自己各自的方法(如不同鸭子不同的外貌)。由于业务的需求,我们需要实现让鸭子飞,如果在父类Duck中直接实现fly()方法,可能会出现一些问题,如继承Duck的模型鸭也会实现了飞行,除此之外模型鸭只会吱吱叫,显然与父类的呱呱叫不符。
方案一:利用继承,每个鸭子在自己的内部实现quack()和fly()方法,模型鸭在类方法quack()中用吱吱叫覆盖原有方法。
不可行:因为产品会变,一旦quack()和fly()方式变了,就要检查所有的子类,并可能去覆盖原有的方法,不符合代码复用原则
设计:
原则一:找出应用中可能需要变化的部分独立出来,不要和不变的混在一起。
实现一:将fly()和quack()方法,单独拎出来实现,分别建立一组新的类代表每个行为(如FlyWithWings、FlyNoWay)。
原则二:针对接口编程,而不是针对实现编程。
实现二:所有的飞行类都继承FlyBehavior接口,同理quack
优点:利用多态可以实现超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。
// d为Dog类型,必须对具体代码进行实现
Dog d = new Dog();
d.bark();
// 定义Animal类型的引用,指向Dog对象,可以实现多态调用(既可以实现子类独特的功能,也可以抽取父类的共性)。
Animal a = new Dog();
a.makeSound();
原则三:多用组合,少用继承
实现三:将两个类结合起来使用就是组合,如每个鸭子都有一个FlyBehavior和QuackBehavior,将飞行和呱呱叫委托给他们代为处理。
优点:有一个(HAS-A)比是一个(IS-A)可能更好,使用组合建立系统具有很大的弹性,不仅可将算法簇封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
实现:
// 所有飞行行为都必须实现接口
public interface FlyBehavior{
public void fly();
}
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I am flying");
}
}
public class FltNoWay implements FlyBehavior{
public void flt(){
System.out.println("I can't fly");
}
}
// 实现抽象的鸭子父类
public abstract class Duck{
FlyBehavior flyBehavior; //为行为接口声明两个引用变量,所有鸭子都会继承它们
public abstract void display();
public void performFly(){
flyBehavir.fly();
}
public void swim(){
System.out.println("All ducks float");
}
}
// 实现Duck类
public class MallardDuck extends Duck{
public MallardDuck (){
flyBehavior = new FlyWithWings(); // 使用FlyWithWings作为FlyBehavior的类型
}
public void display(){
System.out.println("I'm a real Mallard duck");
}
}
// 主类
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performFly(); // 调用继承类的performFly()方法
}
}
总结:
策略模式定义了算法簇,分别封装起来,让它们之间可以故乡替换,此模式让算法的变化独立于使用算法的客户。
模式被认为是历经验证的OO设计经验,它不是代码,而是针对设计问题的通用解决方案。我们可以把他们应用到特定的应用中。它不是被发明,而是被发现。
大多数的模式和原则,都是着眼于软件变化的主题。我们常常把变化的部分和不变的部分分离开来。
模式让开发人员之间有共享的语言,能够最大化沟通的价值。