OOP 面向对象 七大原则 (一)
OOP 面向对象 七大原则 (一)
大家众所周知,面向对象有三大特征继承封装多态的同时,还具有这七大原则,三大特征上一篇已经详细说明,这一篇就为大家详解一下七大原则: 单一职责原则,开闭原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则,组合聚合复用原则
单一职责原则:一个类只负责一个领域的内容,简而言之就是自己的类负责自己的事情,与别的类互不干涉
场景案例:女孩子购物
/**
* oop 单一原则实现
* @author gongliying
* @data 2019-06-10
*/
aaa(){
class People{
getAll(){
console.log("打车去Dior实体店买口红")
console.log("打车去Only实体店买裙子")
}
}
new People().getAll();
}
打车去实体店买口红跟打车去实体店买裙子,我虽然写在了同样一个方法里面,但是呢却不能同时进行
解决思路:面向对象单一职责,一个类只做一件事情,互不干涉
aaa(){
class People{
Dior(content){
console.log('打车去Dior实体店买' + content)
}
Only(content){
console.log('打车去Only实体店' + content)
}
getAll(){
this.JD('口红')
this.TM('裙子')
}
}
new People().getAll(); //打车去Dior实体店买口红
//打车去Only实体店买裙子
}
这样事情就解决了,一个类方法只做一件事情,我在Dior的方法中只能去买口红,不能去进行买裙子的操作,这就是单一原则
开闭原则:对修改关闭,对扩展开放
一个对象(模板,类,方法)只要是在生命周期内,都会发生变化,而开闭原则就是在不修改原有模块的基础上,扩展其功能
还以口红为例,商场中有一家店面里面之后Dior和CHANEL两个品牌,那么店员介绍的品牌不是Dior就是CHANEL,一般情况下都会这样写
/**
* oop 开闭原则实现
* @author 宫丽颖
* @date 2019-06-13
*/
achieve(){
let type ='dior'
if (type == 'dior') {
console.log('这是dior')
}else{
console.log('这是chanel')
}
}
//这是dior
这样写是没有什么问题的,但是呢,店面中又有新牌子了ysl,这就变成不是dior 不是CHANEL就是ysl了 随之我们的代码就又变成的这样
/**
* oop 开闭原则实现
* @author 宫丽颖
* @date 2019-06-13
*/
achieve(){
let type ='chanel'
if (type == 'dior') {
console.log('这是dior')
}else if(type == 'chanel'){
console.log('这是chanel')
}else{
console.log('这是ysl')
}
//这是chanel
},
随着商店店面更新的口红牌子越来越多,需求越来越多的时候,随之意味这样的代码,对原来代码的修改也越来越多,如果一不小心改错的话,可能整段就垮掉,为了解决这样的事件,建议使用开闭原则,对修改关闭,对扩展开放
/**
* oop 开闭原则实现
* @author 宫丽颖
* @date 2019-06-13
*/
achieve() {
let type = 'ysl'
if (type == 'dior') return this.dior.dior();
if (type == 'chanel') return this.chanel.chanel();
if (type == 'ysl') return this.ysl.ysl();
}, dior : {
dior() {
alert('这是dior')
}
},
chanel : {
chanel() {
alert('这是chanel')
}
},
ysl : {
ysl() {
alert('这是ysl')
}
} //结果为弹出 这是ysl
这样增加需求的时候直接在data里面定义一个就好了,再多的需求也不怕不怕啦~~~
里氏替换原则:父类能出现的地方,可以用子类代替,子类拥有父类的所有属性和方法,通俗来说子类拥有父类的功能,可以拓展父类的功能,但是不能修改父类的功能
口红为例?
/**
* oop 里氏替换原则实现
* @author 宫丽颖
* @date 2019-06-13
*/
achieve() {
class Kouhong{
constructor(e){
this.name=e.name
this.price=e.price
}
look(){
console.log(this.name,'的口红,一共',this.price,'元')
}
} //子类
class Dior extends Kouhong{
look(){
console.log('这是',this.name,'的口红,一共',this.price)
}
} var kouhong = new Kouhong({
name:"砖红色",
price:300
})
var dior =new Dior({
name:"脏橘色",
peice:280
}) kouhong.look() //砖红色 的口红,一共 300 元
dior.look() //这是 大红色 的口红,一共 280 },
这样写的话,你会发现子类直接覆盖了父类的内容,修改了父类的功能,虽然代码上没什么问题,但是对于以后的优化有着很大的影响,也违背了里氏替换原则,里氏替换原则要求拥有父类的所有方法,可以扩展父类的方法,但是不能修改,我用历史替换比较一下
/**
* oop 里氏替换原则实现
* @author 宫丽颖
* @date 2019-06-13
*/
achieve() {
class Kouhong{
constructor(e){
this.name=e.name
this.price=e.price
}
look(){
console.log(this.name,'的口红,一共',this.price,'元')
}
saw(){
console.log('口红很贵哦的!!')
}
} //子类
class Dior extends Kouhong{
look(){
console.log('这是',this.name,'的口红,一共',this.price)
}
} class CHANEL extends Kouhong{
see(){
console.log('这是',this.name,'的口红,一共',this.price,'元')
}
so(){
console.log('因为那么贵所以才买不起嘛!!!!')
}
} var kouhong = new Kouhong({
name:"砖红色",
price:300
})
var dior =new Dior({
name:"脏橘色",
price:280
})
var chanel = new CHANEL({
name:"豆沙色",
price:320
}) kouhong.look() //砖红色 的口红,一共 300 元 父类本身
dior.look() //这是 脏橘色 的口红,一共 280 子类1继承父类将父类方法覆盖
chanel.look() //豆沙色 的口红,一共 320 元 子类2继承父类显示父类方法
chanel.see() //这是 豆沙色 的口红,一共 320 元 子类2在继承父类上扩展自己的方法
chanel.saw() //口红很贵哦的!! 子类2继承父类另一个方法 子类继承了父类的所有方法
chanel.so() //因为那么贵所以才买不起嘛!!!! 子类2扩展自己的另一个方法 },
由此可见,子类1在继承父类的时候将父类覆盖,但是子类2在继承父类的时候继承了父类的所有方法并扩展了自己的方法,这就是里氏替换原则
依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。(节选自百度百科)
emmmm,很官方的一句话 ,我用白话解释一下,就是说高层的模块不要依赖于低层的模块,不要靠比自己层级低的模块,高层低层应该同时依靠抽象,而抽象不应该依赖于细节而是应该细节依赖抽象 ,要是还没有懂的话,画张图把,当然还是口红为例了
这样看是不是看懂了呢 这个人就是高层,左图就是在说 高层依赖低层,如果这个高层抹口红就只能抹口红,不能在抹其他的 ,要是想在抹别的,就要再加方法,太啰嗦
而右图就是在说明定义了一个抽象类抹,如果没有口红了还可以抹眼影啊,粉底之类的,人与眼影之间依赖抹这个抽象类来实现,这个抹眼影 这个细节依赖于抽象抹这个类,而这个高层人也可以创建不同的高层话不多说,代码附上
class cosmetics{
daub(){
console.log('抹了什么?')
}
}
class kouhong extends cosmetics{
go(){
return "抹了口红"
}
}
class yanying extends cosmetics{
go(){
return "抹了眼影"
}
}
class fendi extends cosmetics{
go(){
return "抹了粉底"
}
}
class people {
constructor(name) {
this.name = name
}
gotoEat(mo) {
console.log(this.name, mo.go())
}
}
kouhong = new kouhong
yanying = new yanying
fendi = new fendi
gong = new people('宫')
liying = new people('丽颖') gong.gotoEat(kouhong) //宫 抹了口红
gong.gotoEat(yanying) //宫 抹了眼影
gong.gotoEat(fendi) //宫 抹了粉底 liying.gotoEat(fendi) //丽颖 抹了粉底
结果我不仅通过抹的抽象类,创建了不同的细节,还创建不同的高层,不同的人通过抹的类创建了不同的细节,他们之间是不会相互影响的,这就是依赖倒置原则。
OOP 面向对象 七大原则 (一)的更多相关文章
- OOP 面向对象 七大原则 (二)
OOP 面向对象 七大原则 (二) 上一篇写到了前四个原则,这一篇继续~~ 接口隔离:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 又是一句大白话~就是说接口尽量 ...
- OOP面向对象程序设计原则
OOP面向对象程序设计原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle) 继承必须确保超累所 ...
- OOP编程七大原则
OCP(Open-Closed Principle),开放封闭原则:软件实体应该扩展开放.修改封闭.实现:合理划分构件,一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里:一种可变性不应 ...
- 【设计模式系列】之OO面向对象设计七大原则
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
- C#面向对象设计的七大原则
本文我们要谈的七大原则,即:单一职责,里氏替换,迪米特法则,依赖倒转,接口隔离,合成/聚合原则,开放-封闭 . 1. 开闭原则(Open-Closed Principle, OCP) 定义:软件实 ...
- Java 程序员应在2019年学习的10条面向对象(OOP)设计原则
面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 Observer 模式之类的设计模式,而对学习面向 ...
- GOF 的23种JAVA常用设计模式总结 03 面向对象七大设计原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 各位代码界的大佬们总结出的七 ...
- 设计模式的七大原则(Java)
一.OOP三大基本特性 OOP 面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法.模型是用来反映现实世 ...
- 【设计模式】第一篇:概述、耦合、UML、七大原则,详细分析总结(基于Java)
迷茫了一周,一段时间重复的 CRUD ,着实让我有点烦闷,最近打算将这些技术栈系列的文章先暂时搁置一下,开启一个新的篇章<设计模式>,毕竟前面写了不少 "武功招式" 的 ...
随机推荐
- win server 2008 r2 iis+php 500错误内部服务器错误。
今天遇到一个错误是iis 500错误,由于server是别人负责的.查看日志没什么异常,就发如今任务日志里发现有一段时间间隔没有记录.一開始不知道为什么.之后日志里就都是500错误了,在iis哪里配置 ...
- matlab7安装后的常见问题
1.有时候.打开MatLab7时,会弹出"找不到指定的模块"对话框,如图(1)所看到的: 图(1) 找不到指定模块 产生这个问题的解决办法是.你的BLAS_VERSION环境变量没 ...
- ant 调用
博客园 首页 新随笔 联系 订阅 管理 [图文] 使用ant编译和发布java项目 开发JavaEE项目经常会碰到修改代码后,项目没有重新编译的问题.老大给指明了一个解决办法:用ant ...
- [think in java]第12章 通过异常处理错误
异常处理是java中唯一正式的错误报告机制. 而且通过编译器强行运行. 异常參数 抛出异常与方法正常返回值的差别:异常返回的"地点"与普通方法调用返回的"地点" ...
- Maven—Windows操作系统中安装配置Maven环境
今天难得的周末,借此难的机会总结一下关于maven的一些操作: 1.在安装maven之前要确认计算机已经安装并配置了JDK. 2.下载maven: maven-3.0.3:http://downloa ...
- 国内物联网平台初探(七) ——Ablecloud物联网自助开发和大数据云平台
平台定位 面向IoT硬件厂商,提供设备联网与管理.远程查看控制.定制化云端功能开发.海量硬件数据存储与分析等基础设施,加速硬件实现联网智能化. 架构 服务 云端服务一体化开发引擎 业内独创一体化开发引 ...
- [POJ 1934] Trip
[题目链接] http://poj.org/problem?id=1934 [算法] 先用dp求出LCS,然后搜索即可,注意加上一些剪枝 [代码] #include <algorithm> ...
- 机器学习——SVM讲解
支持向量机(Support Vector Machine) SVM是一类按监督学习方式对数据进行二元分类的广义线性分类器,决策边界是对学习样本求解的最大边距超平面.只需要知道,SVM是一个有监督的分类 ...
- xBIM 基础02 快速入门
系列目录 [已更新最新开发文章,点击查看详细] 一.新建项目 Visual Studio 新建项目.项目创建完成后 Nuget ,项目添加 Xbim.Essentials,那么如果项目需要几何 ...
- 关于Html基础语法学习
晚上做完初赛,好像有点颓,就来学了学html,毕竟博客里面会用到嘛. 首先贴出我所学习的教程 http://www.w3school.com.cn/html/index.asp 我觉得吧,可能以我的记 ...