设计模式--策略模式(strategy)
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)相关推荐
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?
文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...
- 设计模式 – 策略模式(Strategy)
2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø 客户端代码Main.java package com.yilong ...
- 设计模式 - 策略模式Strategy
策略模式(Strategy): 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1 using System; 2 using System.Co ...
- 设计模式——策略模式( Strategy Pattern )
写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...
- Java设计模式-策略模式(Strategy)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...
最新文章
- [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
- 为AI从业者/研究生/研究员专门定制的全网唯一高端AI训练营
- maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图
- List------Linked 链表
- 【机器学习】决策树算法
- 数据结构(一)--稀疏数组
- 跟我一起学Redis之Redis事务简单了解一下
- PHP 完整实战23种设计模式
- php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单
- jQuery 方法 十四. html()方法和text()方法
- [每日一题] OCP1z0-047 :2013-07-13 oracle 10g正则表达式 REGEXP_LIKE 用法
- 自动编译 打包 签名 android程序
- 找不到minidump.dmp文件
- 三乘三魔方教程,按步骤来肯定能搞出来
- 注塑过程中30个常见的问题及对策
- 在学习少儿编程中体会AI乐趣
- 为静态照片添加动画表情的iOS应用MugLife来了,网友惊呼「这技术等着被收购吧」
- 2021消防设施操作员考试实操口述题及答案解析
- kaldi跑自己数据遇到的问题合集(持续更)
- 2018百度沸点国人年度榜单出炉