1.策略模式(strategy ['strætədʒi])

我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈)

看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看

他们生产鸭子,我们就制造人

父类 Person类

1 public abstract class Person {
2     //唱歌可就不一样了,唱法不同,唱功不同;而且哑巴不能唱歌
3     public void singing(){
4         System.out.println("我要唱歌");
5     }
6
7     //吃饭,大家没什么区别吧
8     public abstract void eating();
9 }

View Code

/*每个人都会吃饭,所以eating()可以继承,但singing()就不能一样处理了,因为有些人天生不能发声,或者差别很大

所以在Person类中就不应该写这个方法,否则Dummy哑巴类就会从Person类继承到singing(),这明显是不合理的,

而这里可以考虑将singing()独立成一个singable接口,

1 public interface Singable {
2      public void sing();
3 }

View Code

实现singable的ZhangSan:

public class ZhangSan extends Person implements Singable{@Overridepublic void sing() {// TODO Auto-generated method stub
        }}

View Code

再根据需要实现这个接口,原理上是可以实现,但是接口有个缺点:

就是不能实现具体的方法:接口什么都不做,你实现后还是要写代码,根本做不到代码重用,如果实现接口的类数量很大的话,

那这个工作量很不划算。

**虽然每个人唱歌都不同,而且还有人不能唱,但其实唱歌的种类是可以预计的

唱法也就那么几种:通俗,美声,民族,R&B·····

接口是不能重用代码,那我们就先预先实现一组的接口实现类

通俗唱法:

public class TongSuSinging implements Singable {@Overridepublic void sing() {System.out.println("找不到方向,到彩虹天堂·····");}}

View Code

美声唱法:

public class MeiShengSinging implements Singable{@Overridepublic void sing() {System.out.println("you and me,together.");}}

View Code

民族唱法:

public class MinZuSinging implements Singable{@Overridepublic void sing() {System.out.println("五十六个民族,五十六枝花....");}}

View Code

这里,我们不打算直接实现singable接口类,而是使用了组合,所以父类Person类,修改成:

public abstract class Person {//使用组合,将Singable作为Person的成员变量private Singable singable;//再增加动态赋值的方法public void setSingable(Singable s){singable = s;}//此时的sing()方法应该这样写public void sing(){singable.sing();//这里就是面向接口编程,可以使用多态
    }//吃饭,大家没什么区别吧public abstract void eating();
}

View Code

李四类,

1 public class LiSi extends Person {
2
3     @Override
4     public void eating() {
5         // TODO Auto-generated method stub
6
7     }
8
9 }

View Code

测试类Test

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         LiSi ls = new LiSi();
 5         //想要美声唱法,那就生成美声唱法的对象,但是类型统一用Singable
 6         Singable s = new MeiShengSinging();
 7         ls.setSingable(s);
 8         ls.sing();
 9
10         //想要通俗唱法,就生成通俗唱法的对象
11         s = new TongSuSinging();//调用的代码完全不变,仅仅是new的对象类型变了而已
12         ls.setSingable(s);
13         ls.sing();
14     }
15
16 }

View Code

我也说一下我对策略模式的看法吧,有错误欢迎指正,大家共同进步嘛

优势:

如上所述,第一:避免了普通继承的一味重复,因为不变的内容还留在父类中,会改变的内容通过组合的方式来加成;

第二:同时使用了面向接口编程,代码修改率大大变小(其实所有的设计模式都有这个优点,不再是一次性代码了)

第三:用户要实现不同的功能是只要实现接口,生成新的类就可以了,并且这些类之间是可以随时替换的(因为多态嘛)

缺点:第一:还是要生成不少类(每个方法一个类···)

第二:你要预先知道大概要生成多少个类,(虽然总数不能确定,但变化是可以预见的情况下,才推荐使用策略模式)

*/

(PS:要写一篇好的博客真的好辛苦也好不容易啊····)

最后推荐大家看这两篇博客 1 和 2

设计模式--策略模式(strategy)相关推荐

  1. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  2. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  3. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  4. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  5. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  6. 设计模式 – 策略模式(Strategy)

    2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø  客户端代码Main.java package com.yilong ...

  7. 设计模式 - 策略模式Strategy

    策略模式(Strategy): 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1 using System; 2 using System.Co ...

  8. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  9. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

最新文章

  1. [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
  2. 为AI从业者/研究生/研究员专门定制的全网唯一高端AI训练营
  3. maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图
  4. List------Linked 链表
  5. 【机器学习】决策树算法
  6. 数据结构(一)--稀疏数组
  7. 跟我一起学Redis之Redis事务简单了解一下
  8. PHP 完整实战23种设计模式
  9. php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单
  10. jQuery 方法 十四. html()方法和text()方法
  11. [每日一题] OCP1z0-047 :2013-07-13 oracle 10g正则表达式 REGEXP_LIKE 用法
  12. 自动编译 打包 签名 android程序
  13. 找不到minidump.dmp文件
  14. 三乘三魔方教程,按步骤来肯定能搞出来
  15. 注塑过程中30个常见的问题及对策
  16. 在学习少儿编程中体会AI乐趣
  17. 为静态照片添加动画表情的iOS应用MugLife来了,网友惊呼「这技术等着被收购吧」
  18. 2021消防设施操作员考试实操口述题及答案解析
  19. kaldi跑自己数据遇到的问题合集(持续更)
  20. 2018百度沸点国人年度榜单出炉

热门文章

  1. 未来五年,谁将挑战德国太阳能擂主
  2. 生成验证码的一段源代码
  3. IronRuby 发布第一个版本
  4. xml+javascript实现简单图片轮换
  5. operator* operator- 操作符的使用
  6. C++开发环境搭建_需要学习的内容介绍_写第一个C++程序---C++语言工作笔记008
  7. 通过人脸测试心率和呼吸率
  8. 初学关键段容易忽略的问题
  9. java 两个list相等_java 怎么比较两个list是否相同
  10. 执行计划有时不准确_高效学习计划的制定原则和分类执行方法