策略模式将程序的不变部分保留,可变部分单独拿出,然后封装起来,让今后此功能的扩展和修改更加方便。

此策略强调使用组合而非继承。

案例:

我们想模拟两种鸭子: 普通鸭, 橡胶鸭

我们知道这三种鸭子不可变的是都会游泳(swim),可变的是:能否飞(fly) 和 能否叫(quack)

第一步:我们将可变部分拿出,分别封装为两个接口:flyBehavior 和 quackBehavior

public interface FlyBehavior {public void fly();
}----------------------------------分割线----------------------------------------------
public interface QuackBehavior {public void quack();
}

----------------------------------分割线----------------------------------------------

第二步:

飞行行为(flyBehavior)分为会飞(FlyWithWings不会飞(FlyNoWay

所以我们应该新创建两个新class继承接口flyBehavior:

public class FlyWithWings implements FlyBehavior {public void fly(){System.out.println("我会飞");}
}

----------------------------------分割线----------------------------------------------

public class FlyNoWay implements FlyBehavior {public void fly(){System.out.println("我不会飞");}
}

第三步:

同理鸣叫行为(QuackBehavior)分为会叫(Quack不会叫(MuteQuack

public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("我会叫");}
}

----------------------------------分割线----------------------------------------------

public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("我不会叫");}
}

第四步:

建立鸭子父类Duck, 加入两个实例变量 flyBehavior 和 quackBehavior(也就是第一步创建的两个接口)以及两个实例变量的配套方法performFly(), performQuack(),setFlyBehavior,setQuackBehavior。

还有两个不变方法 display() 和 swim()

public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("All ducks float, even decoys!");}public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public  void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}}

第五步:

创建两个class 橡胶鸭(RubberDuck) 和 普通鸭(ModelDuck), 分别继承第四步创建的Duck

public class RubberDuck extends Duck {public RubberDuck(){//橡胶鸭不会飞flyBehavior = new FlyNoWay();//橡胶鸭会叫quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("我是橡胶鸭");}
}

----------------------------------分割线----------------------------------------------

public class ModelDuck extends Duck{public ModelDuck(){//普通鸭会飞flyBehavior = new FlyWithWings();//普通鸭会叫quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("我是普通鸭");}
}

第六步:

大功告成!喝口水庆祝一下

第七步 :测试

创建一个class 用于测试

public class MiniDuckSimulator {public static void main(String[] args) {Duck rubber = new RubberDuck();rubber.display();rubber.performFly();rubber.performQuack();System.out.println("-------------------------------------------");Duck model = new ModelDuck();model.display();model.performFly();//飞行状态改为不会飞model.setFlyBehavior(new FlyNoWay());model.performFly();}

结果:

我是橡胶鸭
我不会飞
我会叫
-------------------------------------------
我是普通鸭
我会飞
我不会飞

第八步:

加入新功能火箭飞行(RocketPoweredFly

创建新类RocketPoweredFly, 继承接口 FlyBehavior

public class RocketPoweredFly implements FlyBehavior{@Overridepublic void fly() {System.out.println("我可以火箭推动");}
}

测试

public class MiniDuckSimulator {public static void main(String[] args) {Duck model = new ModelDuck();model.display();model.performFly();//飞行状态改为火箭飞行model.setFlyBehavior(new RocketPoweredFly());model.performFly();}
}

结果:

我是普通鸭
我会飞
我可以火箭推动

Java 设计模式之策略模式(Strategy Pattern)相关推荐

  1. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  2. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  3. 锈才学设计模式之 —— 策略模式(Strategy Pattern)

    锈才学设计模式之  -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...

  4. 设计模式实战-策略模式(Strategy Pattern)

    0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...

  5. Java设计模式之——策略模式(Strategy)

    一.例子 令狐冲被岳不群罚在思过崖上面壁思过.偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式.所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式. ...

  6. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

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

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

  8. Java 设计模式之策略模式

    一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...

  9. java解决策略膨胀_折腾Java设计模式之策略模式

    简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...

  10. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

最新文章

  1. 【转】Itween 贝塞尔曲线(一)
  2. python中使用格式化字符串
  3. android bool定义,android-R.bool
  4. 专题导读:新基建环境下的数据资产价值评估与定价
  5. html新增伪类,css3新增伪类有哪些
  6. 【英语学习】【Level 08】U05 Better option L4 Being social
  7. [河南省ACM省赛-第四届] 表达式求值(nyoj 305)
  8. [译]深入 NGINX: 为性能和扩展所做之设计
  9. java中关于x轴翻转和y轴翻转如何计算_如何用加速度计提高倾角测量精度?
  10. django+xadmin在线教育平台(四)
  11. html 恶作剧无限弹窗
  12. 车型车系品牌api离线版 CarApi
  13. UNIX网络编程卷1:套接字联网API(第3版).pdf
  14. android9应用icon尺寸,APP-icon尺寸
  15. 【Linux】之 从源代码安装软件(HelloWorld)
  16. Hello MySQL(八)——自定义函数
  17. es6 三点运算符_ES6/ES7 三点式 —— 扩展运算符与剩余操作符
  18. VMWare下载安装以及创建虚拟机教程
  19. 缓解迷茫焦虑的最好方法:用自己的方式好好生活
  20. 「助记词密盒」用户协议与隐私政策

热门文章

  1. 通过阿里云api获取ecs主机信息
  2. ivor horton《c语言入门经典》,《C语言入门经典》Ivor Horton第九章练习题
  3. 紫装の槍使い(トゥーヴァ) / 紫枪(异时层土法)
  4. Python的一个小程序题
  5. Miniconda3环境搭建详细流程
  6. [译] 改善 DaVinci Resolve 性能的 5 个秘诀
  7. Windows/Ubuntu双系统磁盘管理中删除Ubuntu分区后Ubuntu EFI分区无法删除卷解决办法
  8. STM32-USB学习系列(一) :USB与USB库的介绍
  9. 二维码怎么知道自己被扫描 ()==> java 篇 带一点点(Android)
  10. jQuery UI 拖拽功能