【Java学习笔记】30:OCP设计原则

来源:互联网 发布:在家做淘宝客服招聘 编辑:程序博客网 时间:2024/05/21 14:47

OCP设计原则,即Open Close Principle,指对程序的扩展是开放的,而对修改是关闭的。

*不符合OCP的设计

package day30;public class Test {    public static void main(String[] args) {        Cat cat=new Cat();        Dog dog=new Dog();        Person p=new Person();        p.feed(cat);        p.feed(dog);    }}class Dog{    public void eat(){        System.out.println("dog eat...");    }    public void sleep(){        System.out.println("dog sleep...");    }}class Cat{    public void eat(){        System.out.println("cat eat...");    }    public void sleep(){        System.out.println("cat sleep...");    }}class Person{    public void feed(Dog dog){        dog.eat();        dog.sleep();    }    public void feed(Cat cat){        cat.eat();        cat.sleep();    }}

在上面的代码中,如果想养一只鸟(想要扩展),那么Person类里就需要修改(需做修改),这不符合“对扩展是开放的,对修改是关闭的”。
要符合OCP设计原则,就要依赖抽象而非具体,尝试对上面的代码进重构。Dog,Cat,Bird中有共同的方法sleep()和eat(),尝试把它们抽象出来(向上抽象到一个Pet类或接口)里),然后让Person去依赖抽象出的Pet,而不是具体的哪一种宠物,这就是依赖抽象而非具体。

*符合OCP的设计

package day30;public class Test {    public static void main(String[] args) {        Pet p1=new Cat();        Pet p2=new Dog();        Person p=new Person();        p.feed(p1);        p.feed(p2);    }}//抽象出的Petinterface Pet{    public void eat();    public void sleep();}class Dog implements Pet{    @Override    public void eat(){        System.out.println("dog eat...");    }    @Override    public void sleep(){        System.out.println("dog sleep...");    }}class Cat implements Pet{    @Override    public void eat(){        System.out.println("cat eat...");    }    @Override    public void sleep(){        System.out.println("cat sleep...");    }}class Person{    //依赖Pet接口而不是实现接口的宠物类    public void feed(Pet pet){        pet.eat();        pet.sleep();    }}

当要扩展上面的代码,要加入一个宠物Bird类时,不需要修改Person类(因为它依赖的是抽象的Pet接口),这也就是“对扩展是开放的,对修改是关闭的”。

*用继承关系实现

package day30;public class Test {    public static void main(String[] args) {        Pet p1=new Cat();        Pet p2=new Dog();        Person p=new Person();        p.feed(p1);        p.feed(p2);    }}//抽象出的Petabstract class Pet{    abstract public void eat();    abstract public void sleep();}class Dog extends Pet{    @Override    public void eat(){        System.out.println("dog eat...");    }    @Override    public void sleep(){        System.out.println("dog sleep...");    }}class Cat extends Pet{    @Override    public void eat(){        System.out.println("cat eat...");    }    @Override    public void sleep(){        System.out.println("cat sleep...");    }}class Person{    //依赖Pet类而不是继承它的宠物类    public void feed(Pet pet){        pet.eat();        pet.sleep();    }}