前一段时间在朋友的极力推荐下,有幸拜读了head.first 的大作《设计模式》,阅读了几章之后猛然发现,原来技术文章也可以写的如此通俗,优雅。遂想将个人的一些读后感和对书中设计模式的理解整理成文,与众程序员朋友分享。同时,也希望您能慷慨的发表自己的看法与理解,帮助新晋的程序员朋友在软件开发之路上走的更加从容。如果您正好看过此书,请一定不吝赐教。欢迎大家拍砖!
下面是我对书中策略模式的讲解的分析:
场景:一款模拟鸭子的游戏,游戏中出现各种鸭子,一边戏水,一边呱呱叫
描述:有一个鸭子的抽象类,各种鸭子继承此类
鸭子种类:红头鸭,绿头鸭,木头假鸭,橡皮鸭
抽象类的方法:quack(),swim(),abstract display()
补充:抽象类中已对quack和swim进行了实现。鸭子正常叫为呱呱叫,红头与绿头鸭呱呱叫,木头鸭不会叫,橡皮鸭会吱吱叫
此设计优点:子类可复用quack(),swim()方法
此设计缺点:个别种类的鸭子需要覆盖父类的quack方法满足自己的需求(例如木头鸭不会叫)
public abstract class Duck{
public void quack(){
System.out.println("呱呱叫");
}
public void swim(){
System.out.println("戏水");
}
public abstract void display();
}
需求:需要某些鸭子能够飞行
方案一:在超类中增加fly()方法并对其实现
缺点:所有的鸭子都拥有了fly()的功能,哪怕本身不能fly(),凡是增加新的鸭子类都需要对fly()方法进行检测,如不需要则必须覆盖
public abstract class Duck{
public void quack(){
System.out.println("呱呱叫");
}
public void swim(){
System.out.println("戏水");
}
public void fly(){
System.out.println("飞行");
}
public abstract void display();
}
方案二:将fly()方法抽出写入接口,需要的自行实现该接口
缺点:无法复用,重复代码增多
public interface Flyable{
public void fly();
}
症结:鸭子的某些行为在子类中会不断的变化,让所有子类都拥有这类的行为是不恰当的
设计原则:(封装变化)找出应用中可能需要变化之处,把它们独立出来,和不需要改变的分开,以便它们可以独立的修改和扩展而不影响其他部分
解答:将fly,quack方法抽出为两组独立的类型,并根据需要进行不同的实现。例如,quack类型组可以包含,安静,呱呱叫,吱吱叫
public interface Quack{
public void quack();
}
public interface Flyable{
public void fly();
}
public class FlyWithWing implements Flyable{
public void fly(){
System.out.println("用翅膀飞行");
}
}
public class ZhiZhiQuack implements Quack{
public void quack(){
System.out.println("吱吱叫");
}
}
public class GuaGuaQuack implements Quack{
public void quack(){
System.out.println("呱呱叫");
}
}
补充:由于一开始鸭子行为设计的没有弹性才出现了以上的情况,所以应该采用一种弹性的方案。可以根据需要动态改变鸭子的行为
设计原则:(鸭子类不在拥有具体的行为实现方法,只拥有行为的引用接口)针对接口编程,而不是针对实现编程
解答:鸭子的行为放在分开的类中,让该类提供某行为接口的实现
设计原则:多用组合,少用继承(鸭子的行为不再是继承而来,而是组合而来)
设计模式:策略模式,定义了算法族(鸭子的行为类型组),分别封装起来,让他们之间可以相互替换,此模式让算法的变化(鸭子的行为)独立于使用算法的客户(鸭子)
public abstract class Duck{
private Quack quack;
private Flyable fly;
public void executeQuack(){
quack.quack();
}
public void executeFly(){
fly.fly();
}
public void setQuack(Quack q){
this.quack=q;
}
public void setFly(Flyable f){
this.fly=f;
}
public void swim(){
System.out.println("戏水");
}
public abstract void display();
}
子类在构造时设定具体的行为即可,并且在运行时也可动态改变。
下面是我对此模式中所使用的一些软件设计原则的看法与感悟:
封装变化:
1.为每种行为的变化定义接口
2.将每种具体的行为封装为类并实现该种行为的接口
解释:本例中的变化的类型是鸭子的行为,包含fly,quack两组。分别对其定义接口,再根据具体的需求予以实现。例如quack接口包含(呱呱叫,吱吱叫,无声)三种具体的实现
针对接口编程:
1.将具体实现委托给接口
2.问题域类只负责接口级别的逻辑控制
3.问题域类的责任依赖于持有的抽象接口而不是具体实现
解释:鸭子类只持有行为的接口,本身不负责实现。对鸭子类进行了
细粒度的抽象,将其具体的行为予以抽离,该问题域类(鸭子)的责任只依赖于内部所持有的接口
多用组合,少用继承:
1.通过组合的方式构建类的行为,而不是继承。可以使类更加灵活,在运行期可动态改变行为
以上便是我的理解,如有不对或者疑惑之处欢迎指出!文中只写出主要的代码,其他代码均已省略,若有需要的朋友可自行参阅该书,亦可发站内信向我索取!
分享到:
相关推荐
这些数据可以帮助医生进行更有效的早期诊断,并制定更精准的疾病预防策略。大数据分析还能够帮助医疗机构合理配置资源,预测疾病流行趋势,从而提高公共卫生应对的效率。在保险行业,利用大数据进行风险评估和保险...
在当今经济体系中,餐饮业扮演着重要的角色,它不仅是人们日常生活的基本需求,也是投资者眼中的“掘金热土”。中国餐饮市场的蓬勃发展态势,带动了市场内部竞争的加剧。在这样一个多变的环境中,餐饮企业若想在激烈...
总体而言,SOHO中国的营销模式是商业地产领域的一次创新尝试,它突破了传统的商业地产开发模式,通过独特的销售策略和对建筑设计的重视,在竞争激烈的市场中找到了自己的定位,实现了快速盈利。尽管存在争议,但SOHO...
深度学习是一种基于人工智能和神经网络的高级学习模式,它强调在学习过程中模仿人脑的思维方式,通过大量数据的处理和模式识别,实现对复杂知识的理解和掌握。在小学语文作文教学中,深度学习能够帮助教师更有效地...
这种精准的市场细分策略不仅提高了发行量,而且也使得瑞丽在广告商的眼中更具吸引力,因为广告商总是倾向于那些能精准到达目标消费者群体的媒体平台。 在实践中,时尚类期刊的营销策略还涉及到了双重盈利模式的构建...
一个有效的教学模式是“师生活动——生与文本活动——生生活动”的交替进行,这其中,可以实施“1+1+2+1”的小组学习模式,即在小组中特别关注优秀生和后进生的发展,让每个学生都能在各自层次上获得最优化的进步。...
钦州市,作为我国南方的一颗璀璨明珠,正以其独特的海滨城市特色和日益凸显的区域优势,成为投资者和消费者眼中的新星。位于此地的年年丰广场,作为重要的商业地产项目,如何把握城市发展脉搏,制定出具有前瞻性和...
比如,在教授“我是独特的”这一主题时,教师可以组织“猜猜他是谁”、“我眼中的他”等活动,让学生认识到每个人的独特性,激发他们的自尊心和自信心,进而培养健康的心理素质。 其次,深度化教学策略强调对课本...
【创新模式概述】 创新是驱动社会和企业发展的重要力量,它源于对既有规则的挑战和突破。"反叛王子"彼得斯的观点强调了创新者在变革中的角色,他们以非传统的方式推动社会进步。创新并不遵循既定的规划,而是面对...
其次,在课堂实施环节,教师应采取生活化的策略,如使用贴近学生生活的案例进行课程导入,利用小组合作学习的教学模式,鼓励学生自主学习和合作探究。此外,教师还应该设置生活化情景,让学生通过情景剧等形式,亲身...
中国(广东)电信正经历从政府事业型向消费者导向型企业的转变,这要求其业务模式从单纯的电信运营转向提供全面的电信服务。面对自由化、数字化、信息化和个人化的四大趋势,中国电信需要适应全球化竞争,提升服务...
这涉及到评估现有的 IT 基础设施,选择合适的云服务提供商,以及制定适应企业规模的演进策略。云计算可以帮助企业降低运营成本,提高运营效率,同时加速响应市场变化。 【结论】 总的来说,云计算是一种革命性的...
在《我的母亲》这一范文中,作者可以先描述社会中普遍赞扬的母爱形象,然后将视角转向个人体验,通过对比传统印象与个人感受,展现出一个女儿眼中别样的母爱,从而让文章的主题更加鲜明和个性化。 无论采用哪种写作...
企业需要在品牌推广策略上进行创新,结合传统推广与线上推广的优势,利用大数据分析深入洞察消费者需求,同时注意及时更新品牌信息,以保持品牌在消费者眼中的形象和信息的新鲜度。这样,企业不仅能有效提升品牌影响...
在当前中国经济稳健发展的大背景下,白酒行业作为中国传统行业中的一大亮点,其持续的增长和稳健的需求,使之成为投资者眼中的一块“香饽饽”。随着消费水平的提升和品质意识的增强,白酒行业的市场规模日益庞大,...
例如,云计算服务、企业级SaaS应用、AI解决方案等领域,由于市场需求持续增长,且具备较高的技术壁垒,成为投资者眼中的“蓝海”。投资这些赛道的企业,往往能享受到行业红利,实现快速增长。 再者,"细分龙头"则是...
学生在写作“我眼中的阅兵”时,可以从不同的视角出发,这不仅锻炼了他们的写作技巧,也深化了他们的爱国情怀。 总的来说,小学语文教学应重视阅读与写作的联动,通过多样化的教学策略,如以读促写、寻找结合点和...
在应用层,那些与日常生活密切相关、市场潜力巨大的应用,如移动支付、智能交通、汽车信息服务、GIS位置业务以及智能电网,成为投资者眼中的关键投资领域。这些领域的迅速发展不仅推动了整个社会的信息化进程,也为...
物业管理,作为现代城市生活中不可或缺的一部分,其专业性与服务范围的广泛...未来,随着市场的不断发展和客户需求的日益多元化,怡高物业仍需持续优化和升级其服务内容和管理策略,以维持和增强其在行业中的领先地位。