`
梵_心
  • 浏览: 741 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

我眼中的策略模式

阅读更多
        前一段时间在朋友的极力推荐下,有幸拜读了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.通过组合的方式构建类的行为,而不是继承。可以使类更加灵活,在运行期可动态改变行为


以上便是我的理解,如有不对或者疑惑之处欢迎指出!文中只写出主要的代码,其他代码均已省略,若有需要的朋友可自行参阅该书,亦可发站内信向我索取!


1
1
分享到:
评论

相关推荐

    我眼中的大数据.doc

    这些数据可以帮助医生进行更有效的早期诊断,并制定更精准的疾病预防策略。大数据分析还能够帮助医疗机构合理配置资源,预测疾病流行趋势,从而提高公共卫生应对的效率。在保险行业,利用大数据进行风险评估和保险...

    餐饮行业商业模式.doc

    在当今经济体系中,餐饮业扮演着重要的角色,它不仅是人们日常生活的基本需求,也是投资者眼中的“掘金热土”。中国餐饮市场的蓬勃发展态势,带动了市场内部竞争的加剧。在这样一个多变的环境中,餐饮企业若想在激烈...

    SOHO中国营销模式分析.docx

    总体而言,SOHO中国的营销模式是商业地产领域的一次创新尝试,它突破了传统的商业地产开发模式,通过独特的销售策略和对建筑设计的重视,在竞争激烈的市场中找到了自己的定位,实现了快速盈利。尽管存在争议,但SOHO...

    基于深度学习进行小学语文作文教学的策略.pdf

    深度学习是一种基于人工智能和神经网络的高级学习模式,它强调在学习过程中模仿人脑的思维方式,通过大量数据的处理和模式识别,实现对复杂知识的理解和掌握。在小学语文作文教学中,深度学习能够帮助教师更有效地...

    试论时尚类期刊营销策略选择.pdf

    这种精准的市场细分策略不仅提高了发行量,而且也使得瑞丽在广告商的眼中更具吸引力,因为广告商总是倾向于那些能精准到达目标消费者群体的媒体平台。 在实践中,时尚类期刊的营销策略还涉及到了双重盈利模式的构建...

    初中语文深度学习指导策略.pdf

    一个有效的教学模式是“师生活动——生与文本活动——生生活动”的交替进行,这其中,可以实施“1+1+2+1”的小组学习模式,即在小组中特别关注优秀生和后进生的发展,让每个学生都能在各自层次上获得最优化的进步。...

    广西钦州年年丰广场广告推广策略提案_94页_XXXX年.pptx

    钦州市,作为我国南方的一颗璀璨明珠,正以其独特的海滨城市特色和日益凸显的区域优势,成为投资者和消费者眼中的新星。位于此地的年年丰广场,作为重要的商业地产项目,如何把握城市发展脉搏,制定出具有前瞻性和...

    新课改背景下的小学道德与法治教学策略探讨.docx

    比如,在教授“我是独特的”这一主题时,教师可以组织“猜猜他是谁”、“我眼中的他”等活动,让学生认识到每个人的独特性,激发他们的自尊心和自信心,进而培养健康的心理素质。 其次,深度化教学策略强调对课本...

    专题资料(2021-2022年)“反叛王子”眼里的创新模式.doc

    【创新模式概述】 创新是驱动社会和企业发展的重要力量,它源于对既有规则的挑战和突破。"反叛王子"彼得斯的观点强调了创新者在变革中的角色,他们以非传统的方式推动社会进步。创新并不遵循既定的规划,而是面对...

    思想品德课堂生活化策略探索

    其次,在课堂实施环节,教师应采取生活化的策略,如使用贴近学生生活的案例进行课程导入,利用小组合作学习的教学模式,鼓励学生自主学习和合作探究。此外,教师还应该设置生活化情景,让学生通过情景剧等形式,亲身...

    世界著名广告策划公司广告沟通策略提案.ppt

    中国(广东)电信正经历从政府事业型向消费者导向型企业的转变,这要求其业务模式从单纯的电信运营转向提供全面的电信服务。面对自由化、数字化、信息化和个人化的四大趋势,中国电信需要适应全球化竞争,提升服务...

    我眼中的云计算.doc

    这涉及到评估现有的 IT 基础设施,选择合适的云服务提供商,以及制定适应企业规模的演进策略。云计算可以帮助企业降低运营成本,提高运营效率,同时加速响应市场变化。 【结论】 总的来说,云计算是一种革命性的...

    山东省淄博淄川区磁村镇中学2013届中考语文 初中记叙文写作模式有范文

    在《我的母亲》这一范文中,作者可以先描述社会中普遍赞扬的母爱形象,然后将视角转向个人体验,通过对比传统印象与个人感受,展现出一个女儿眼中别样的母爱,从而让文章的主题更加鲜明和个性化。 无论采用哪种写作...

    互联网环境下企业品牌推广策略成效研究.pdf

    企业需要在品牌推广策略上进行创新,结合传统推广与线上推广的优势,利用大数据分析深入洞察消费者需求,同时注意及时更新品牌信息,以保持品牌在消费者眼中的形象和信息的新鲜度。这样,企业不仅能有效提升品牌影响...

    白酒行业深度报告与相关股操作策略分析.doc

    在当前中国经济稳健发展的大背景下,白酒行业作为中国传统行业中的一大亮点,其持续的增长和稳健的需求,使之成为投资者眼中的一块“香饽饽”。随着消费水平的提升和品质意识的增强,白酒行业的市场规模日益庞大,...

    计算机行业2020年度投资策略:技术驱动增长,关注优质赛道和细分龙头.zip

    例如,云计算服务、企业级SaaS应用、AI解决方案等领域,由于市场需求持续增长,且具备较高的技术壁垒,成为投资者眼中的“蓝海”。投资这些赛道的企业,往往能享受到行业红利,实现快速增长。 再者,"细分龙头"则是...

    小学语文阅读教学与写作教学联动策略探究.docx

    学生在写作“我眼中的阅兵”时,可以从不同的视角出发,这不仅锻炼了他们的写作技巧,也深化了他们的爱国情怀。 总的来说,小学语文教学应重视阅读与写作的联动,通过多样化的教学策略,如以读促写、寻找结合点和...

    新商业模式或成物联网投资热点分析.docx

    在应用层,那些与日常生活密切相关、市场潜力巨大的应用,如移动支付、智能交通、汽车信息服务、GIS位置业务以及智能电网,成为投资者眼中的关键投资领域。这些领域的迅速发展不仅推动了整个社会的信息化进程,也为...

    我们眼中的物业管理公司.docx

    物业管理,作为现代城市生活中不可或缺的一部分,其专业性与服务范围的广泛...未来,随着市场的不断发展和客户需求的日益多元化,怡高物业仍需持续优化和升级其服务内容和管理策略,以维持和增强其在行业中的领先地位。

Global site tag (gtag.js) - Google Analytics