Java设计模式——开闭原则(实例)
1、基本介绍
- 开闭原则是编程中最基础、最重要的设计原则
- 一个软件实体,如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
- 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
- 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
2、应用实例
绘图功能,类图如下:
2.1未遵循开闭原则
优点是比较好理解,简单操作。
缺点是违反了设计模式的ocp原则,即对扩展开放(提供方),对修改关闭(使用方)。即当给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码。
比如要新增加一个图形种类:三角形时,修改的地方较多
package com.weirdo.principle.ocp;
public class Ocp {public static void main(String[] args) {GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Triangle());}
}
//这是一个用于绘图的类[使用方]
class GraphicEditor {//接收Shape对象,然后根据type,来绘制不同的图形public void drawShape(Shape s) {if (s.m_type == 1) {drawRectangle(s);} else if (s.m_type == 2) {drawCircle(s);} else if (s.m_type == 3) {drawTriangle(s);}}//绘制矩形public void drawRectangle(Shape r){System.out.println("绘制矩形");}//绘制圆形public void drawCircle(Shape r){System.out.println("绘制圆形");}//绘制三角形public void drawTriangle(Shape r){System.out.println("绘制三角形");}
}
//Shape类,基类
class Shape{int m_type;
}
class Rectangle extends Shape{Rectangle(){super.m_type=1;}
}
class Circle extends Shape{Circle(){super.m_type=2;}
}
class Triangle extends Shape{Triangle(){super.m_type=3;}
}
2.2遵循开闭原则
把创建Shape类做成抽象类,并提供一个抽象的draw方法,让子类去实现即可,这样有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可,使用方的代码就不需要修改(满足了开闭原则)
package com.weirdo.principle.ocp.improve;
public class Ocp {public static void main(String[] args) {GraphicEditor graphicEditor = new GraphicEditor();graphicEditor.drawShape(new Rectangle());graphicEditor.drawShape(new Circle());graphicEditor.drawShape(new Triangle());graphicEditor.drawShape(new OtherGraphic());}
}
abstract class Shape{int m_type;//抽象方法public abstract void draw();
}
//这是一个用于绘图的类[使用方]
class GraphicEditor {//接收Shape对象,调用draw方法public void drawShape(Shape s) {s.draw();}
}
class Rectangle extends Shape {Rectangle(){super.m_type=1;}@Overridepublic void draw() {System.out.println("绘制矩形");}
}
class Circle extends Shape {Circle(){super.m_type=2;}@Overridepublic void draw() {System.out.println("绘制圆形");}
}
class Triangle extends Shape {Triangle(){super.m_type=3;}@Overridepublic void draw() {System.out.println("绘制三角形");}
}
//新增一个图形
class OtherGraphic extends Shape{OtherGraphic(){super.m_type=4;}@Overridepublic void draw() {System.out.println("绘制其它图形");}
}
Java设计模式——开闭原则(实例)相关推荐
- 图解Java设计模式-开闭原则
开闭原则是编程中最基础,最重要的设计原则 一个软件实体如类,模块和函数应该对外开放(对提供方),对修改关闭(对使用方).用抽象构建框架,用实现扩展细节 当软件需要变化时,尽量通过扩展软件实体的行为来实 ...
- Java设计模式-开闭原则
总原则:开闭原则(Open Close Principle) 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件 ...
- 设计模式---开闭原则
开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...
- 设计模式-开闭原则(6)
设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 开闭原则 开闭原则是Java世界里最基础的设计原则, 它指导我们如何建立一个稳定的. 灵活的系统, 先来看开闭原 ...
- 23种设计模式-开闭原则
概念: 1) 开闭原则(Open Closed Principle)是编程中最基础.最重要的设计原则 2) 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框 ...
- 设计模式——开闭原则
开闭原则:对扩展开放,对修改关闭. 具体实现:为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成.在很多面向对象编程语言中都提供了接口.抽象类等机制,可以通过它们定义系统的抽象层 ...
- [设计模式]开闭原则
开闭原则: 对扩展开放,对修改关闭. 增加功能是提过增加代码来实现的,而不是去修改源代码. 代码如下: #include <iostream> #include <string> ...
- 设计模式-开闭原则(OCP)
开闭原则(open closed principle) 目标:已有的场景下,对于需要拓展的进行开放,拒绝直接的功能修改 需求: 吃鸡游戏要高亮 + LOL需要弹出折扣 // sprint1 - 青年节 ...
- 设计模式开闭原则--java
静态工厂模式 + 反射控制入参范围 public interface IPrinter {void print(); }public class CanonPrinter implements IPr ...
最新文章
- gns3 查看网关_gns3常用命令
- 非接触物体尺寸形态测量_如何确定接触式和非接触式测量之间的测量技术
- python模块之lib2to3(py2转py3自动化工具)
- mysql8.0.17压缩包安装教程_mysql 8.0.16 压缩包安装配置方法图文教程
- 在uipath_UiPath狂欢节Day 3——国内超级企业CFO大咖RPA案例分享!
- mysql多个外键删除设置_Mysql在删除集上使用多个外键创建表
- 用matlab代码分析不同尺寸的卷积核对图像的影响
- 商品包含资源和劳动两部分内容
- Riverbed宣布收购SD-WAN供应商Ocedo
- 计算机硬盘损坏 数据如何修复,如何修复计算机硬盘错误?如何从硬盘数据损坏中恢复数据?...
- html字大小自适应,html字体大小自适应 怎样让HTML字体自适应到移动端?
- CentOS 6.7 源码搭建LNMP架构部署动态网站环境
- 计算机 竞赛 甘肃,甘肃省第三届创新杯计算机应用能力大赛获奖名单
- 【基于MATLAB的数字图像处理】第三章·基本图像变换
- 成员变量、类变量和静态变量三者的区别
- 面试的时候我为什么会紧张
- 基于JAVA Web的航空订票系统
- 采集时如何有效地防止被网站屏蔽IP
- 利用Jquery Lazyload JS插件实现网页图片延迟加载
- 智慧校园建设主要包括哪些方面的内容?