【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(); }}
阅读全文
0 0
- 【Java学习笔记】30:OCP设计原则
- java设计原则——ocp原则
- Java学习笔记之设计模式原则
- java设计六大原则之开闭原则(OCP)
- 设计原则学习笔记
- 设计原则学习笔记
- 开闭设计原则ocp
- 浅谈设计原则OCP
- OCP设计原则
- java设计模式学习笔记--面向对象设计原则
- 设计模式学习笔记(Java篇)之设计模式原则
- API设计原则学习笔记
- 设计原则(学习笔记)
- OO设计原则学习笔记
- 《JAVA与模式》学习笔记之面向对象设计原则
- 《Java与模式》学习笔记:设计模式——原则
- JAVA与模式学习笔记之设计原则
- 设计模型的原则-OCP(开闭原则)
- PHP开发程序应该注意的42个优化准则
- JAVA经典算法大全
- SpringCloud(八):使用配置文件自定义Ribbon
- 缓存与数据库恩仇录
- Adaboost 算法的原理与推导
- 【Java学习笔记】30:OCP设计原则
- 任务布置之HTTP相关概念
- RxJava2 / RxAndroid2操作符skip
- CSS3 pointer-events:none应用举例及扩展
- 改变状态栏(StatusBar)的颜色
- 【基础功能】c++QT创建.csv文件
- string类的用法详解
- Linux学习路径图
- linux 下使用 vim+cscope+ctags+taglist+NERDtree实现代码阅读编写