《中国好声⾳》评分原则
⼀年⼀度的中国好声⾳⼜结束了,今年冠军叫做:伍珂玥
听了⼀⾸她的歌,觉得很有味道。
中国好声⾳第⼀季好像是2012年,那时候刚上⼤学,每次听到中国好声⾳这个词就会想到了⼤学时光。
那会⼉过得很糊涂但是也很快乐。
⼀、好声⾳第⼀季
今天我们通过⼀个评分规则来讲⼀下策略模式。
假设存在这么⼏个⾓⾊:
学员:姓名、⾝⾼、颜值、歌声感情、歌声⾳准、吐字清楚
导师:姓名、⾃⼰的打分规则(动作)
先创建⼀个学员类:
package;
/**
*@author⽊⼦的昼夜编程
*
*学员类
*/
publicclassStudent{
publicStudent(Stringname,intheight,intlevelOfAppearance,intemotion,intintonation,intenunciation){
=name;
=height;
fAppearance=levelOfAppearance;
n=emotion;
tion=intonation;
ation=enunciation;
}
Stringname;//姓名
intheight;//单位cm
intlevelOfAppearance;//颜值1-100分
intemotion;//情感1-100分
intintonation;//⾳准1-100分
intenunciation;//吐字1-100分
}
再来⼀个导师类:
我们这个导师⽐较正常,不在乎⾝⾼和颜值,给歌声情感30%,歌声⾳准50,吐字清楚20%;
package;
/**
*@author⽊⼦的昼夜编程
*导师类
*/
publicclassTutor{
Stringname;
publicTutor(Stringname){
=name;
}
publicdoublescore(Studentstudent){
doubleres=
n*0.3//情感0.3
+ation*0.2//吐字0.2
+tion*0.5;//⾳准0.5
returnres;
}
}
我们创建⼀个学员(都说程序员没对象可以⾃⼰创建,对的这次我就⾃⼰创建⼀个学员)
然后给打个分。
package;
/**
*@author⽊⼦的昼夜编程
*/
publicclassTest{
publicstaticvoidmain(String[]args){
//创建学员
//姓名、⾝⾼、颜值、情感、⾳准、吐字
Studentxiaoyue=newStudent("⼩玥",170,80,40,80,50);
//创建导师
Tutortutor=newTutor("汪⽼师");
doublescore=(xiaoyue);
n(+"得分:"+score);
}
}
⼆、好声⾳第⼆季
好声⾳来到了第⼆季,这个时候换了导师,导师的评分规则也随之变化了,他们⽐较注重⾝⾼和颜值
打分规则:⾝⾼10%、颜值30%、情感20%、⾳准20%、吐字20%
这时候我们程序怎么适应呢?
那就修改导师呗?
第⼆季导师:
package;
/**
*@author⽊⼦的昼夜编程
*导师类修改版本
*/
publicclassTutor{
Stringname;
publicTutor02(Stringname){
=name;
}
publicdoublescore(Studentstudent){
doubleres=
n*0.2//情感0.3
+ation*0.2//吐字0.2
+tion*0.2//⾳准0.5
+fAppearance*0.3;//颜值0.3
//如果⾝⾼⼤于175就满分否则就6分
if(>175){
res=res+10;
}el{
res=res+10;
}
returnres;
}
}
但是记得我们之前⽂章中讲过的设计原则:⾯向修改关闭,⾯向扩展开放。
我们为了修改规则不得不修改了类,这其实就是违背了我们的原则。
⽐如别的节⽬已经在使⽤这个节⽬的导师评分规则,如果这个规则被修改,那可能会影响其他地⽅。
那我们应该怎么办呢??
三、好声⾳第⼆季新版
这个就需要我们从架构上进⾏调整。
⽽且还需要我们知道⼀些内幕。
假设(我是说假设)导师的评分不是⾃⼰说了算,⽽是导演幕后操作。
那么导师只负责演戏就好。
我们重新设计导师类。
导演指定⼀个打分规则
/**
*@author⽊⼦的昼夜编程
*打分规则抽象
*/
publicabstractclassAbstractScoringRules{
abstractdoublescore(Studentstudent);
}
package;
/**
*@author⽊⼦的昼夜编程
*第⼀季打分规则
*/
publicclassScoringRules01extendsAbstractScoringRules{
@Override
publicdoublescore(Studentstudent){
doubleres=
n*0.3//情感0.3
+ation*0.2//吐字0.2
+tion*0.5;//⾳准0.5
returnres;
}
}
package;
importAbstractRegulations;
/**
*@author⽊⼦的昼夜编程
*导师类-只负责演其他交给导演
*/
publicclassTutorPerformer{
Stringname;
AbstractScoringRulesregulations;
//规则是导演定的
publicTutorPerformer(Stringname,AbstractScoringRulesregulations){
=name;
tions=regulations;
}
publicdoublescore(Studentstudent){
//⽤导演的规则来打分
(student);
}
}
开始打分
package;
/**
*@author⽊⼦的昼夜编程
*/
publicclassTestNew{
publicstaticvoidmain(String[]args){
//创建学员
//姓名、⾝⾼、颜值、情感、⾳准、吐字
Studentxiaoyue=newStudent("⼩玥",170,80,40,80,50);
//创建导师告诉导师打分规则
TutorPerformertutor=newTutorPerformer("汪⽼师",newScoringRules01());
doublescore=(xiaoyue);
n(+"得分:"+score);
}
}
可以看到,这时候就⽐较灵活了,如果想修改评分规则,只需要创建⼀个新的评分规则的⼦类然后传递给导师即可。
这就是我们所谓的⾯向扩展开放。
我们简单看⼀下这个关系图:
所谓的策略,就这个继承关系来看,是不是有点⼉像之前⽂章写到的模板⽅法模式。
但是把实现类当做参数传递给另⼀个类,这就是策略模式,不同的功能⽤不同的⼦类实现不同的策略就可以了。
所以说呀,设计模式只是⼈抽象出来的⼀种概念,不是完全隔离的,是你中有我,我中有你。
四、课外拓展
我们在⼯作中或者是⾯试的时候有没有被问到过怎么⽐较两个对象会问到equals和hashCode
Object的默认实现是直接⽤的==也就是两个⽐较对象是同⼀个引⽤的时候才会相等。
但是我们平时很少⽤⾃带的(除了基本类型外)
我们会⽤Comparable或者是⾃定义Comparator
实现Comparable的话我们需要重写他的compareTo⽅法
我们也可以⾃定义Comparator然后重写compare⽅法
Comparator的思想就是策略模式
我们写⼀个⽰例:
⽐如⽐较两个学员的⾝⾼
⽅式⼀、
package;
/**
*@author⽊⼦的昼夜编程
*淳朴⽅式⽐较
*/
publicclassTestc{
publicstaticvoidmain(String[]args){
//姓名、⾝⾼、颜值、情感、⾳准、吐字
Studentxiaoyue=newStudent("⼩玥",170,80,40,80,50);
Studentxiaoyu=newStudent("⼩于",180,80,40,80,50);
if(>){
n("⼩玥⾼");
}elif(==){
n("⼀样⾼");
}el{
n("⼩于⾼");
}
}
}
⽅式⼆、
Comparable
package;
/**
*@author⽊⼦的昼夜编程
*
*学员类
*/
publicclassStudentCimplementsComparable
publicStudentC(Stringname,intheight,intlevelOfAppearance,intemotion,intintonation,intenunciation){
=name;
=height;
fAppearance=levelOfAppearance;
n=emotion;
tion=intonation;
ation=enunciation;
}
Stringname;//姓名
intheight;//单位cm
intlevelOfAppearance;//颜值1-100分
intemotion;//情感1-100分
intintonation;//⾳准1-100分
intenunciation;//吐字1-100分
@Override
publicintcompareTo(StudentCo){
//我们⼀般这样定义
//返回整数表⽰当前对象this⼤于⽐较对象o
//返回0表⽰当前对象this等于⽐较对象o
//返回负数不是当前对象this⼩于⽐较对象o
if(>){
return1;
}elif(==){
return0;
}el{
return-1;
}
}
}
package;
/**
*@author⽊⼦的昼夜编程
*淳朴⽅式⽐较
*/
publicclassTestc02{
publicstaticvoidmain(String[]args){
//姓名、⾝⾼、颜值、情感、⾳准、吐字
StudentCxiaoyue=newStudentC("⼩玥",170,80,40,80,50);
StudentCxiaoyu=newStudentC("⼩于",180,80,40,80,50);
intres=eTo(xiaoyu);
if(res>0){
n("⼩玥⾼");
}elif(res==0){
n("⼀样⾼");
}el{
n("⼩于⾼");
}
}
}
⽅式三、
⾃定义Comparator
package;
importComparator;
/**
*@author⽊⼦的昼夜编程
*/
publicclassMyComparatorimplementsComparator
@Override
publicintcompare(Studento1,Studento2){
//我们⼀般这样定义
//返回整数表⽰当前对象o1⼤于⽐较对象o2
//返回0表⽰当前对象o1等于⽐较对象o2
//返回负数不是当前对象o1⼩于⽐较对象o2
if(>){
return1;
}elif(==){
return0;
}el{
return-1;
}
}
}
package;
/**
*@author⽊⼦的昼夜编程
*淳朴⽅式⽐较
*/
publicclassTestMyComparator{
publicstaticvoidmain(String[]args){
//姓名、⾝⾼、颜值、情感、⾳准、吐字
Studentxiaoyue=newStudent("⼩玥",170,80,40,80,50);
Studentxiaoyu=newStudent("⼩于",180,80,40,80,50);
MyComparatormyComparator=newMyComparator();
intres=e(xiaoyue,xiaoyu);
if(res>0){
n("⼩玥⾼");
}elif(res==0){
n("⼀样⾼");
}el{
n("⼩于⾼");
}
}
}
好了,结束了。
很突然?对的!都讲完了,⾃⼰动⼿练⼀下吧!
本文发布于:2023-01-26 12:46:42,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/139853.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |