面向对象设计模式之策略模式

1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2.抽象鸭子类,鸭子飞行行为在此处类似于算法族

 1 package com.pattern.strategy;
 2 /**
 3  * 抽象鸭子
 4  * @author Administrator
 5  *
 6  */
 7 public abstract class Duck {
 8
 9     FlyBehavior fb;//行为接口声明两个引用变量,所有鸭子子类都继承他
10     Quack q; //鸭子鸣叫行为接口
11
12
13     //加入两个set方法,用来改变鸭子的行为
14     public void setFb(FlyBehavior fb) {
15         this.fb = fb;
16     }
17
18     public void setQ(Quack q) {
19         this.q = q;
20     }
21
22     public Duck() {
23         // TODO Auto-generated constructor stub
24     }
25
26     public abstract void display();//展示鸭子的样子,不同的鸭子样子不一样
27
28     //鸭子的飞行委托给行为类
29     public void performFly(){
30         fb.fly();
31     }
32
33     public void performQuack(){
34         q.quack();
35     }
36     //所有的鸭子都会游泳
37     public void swim(){
38         System.out.println("all ducks float,even decoys!");
39     }
40
41 }

3.鸭子飞行行为接口

 1 package com.pattern.strategy;
 2 /**
 3  * 所有飞行行为类必须实现此接口
 4  * @author Administrator
 5  *
 6  */
 7 public interface FlyBehavior {
 8
 9     public void fly();
10
11
12
13 }
14 /**
15  * 飞行行为的实现者,给真会飞的鸭子用
16  * @author Administrator
17  *
18  */
19 class FlyWithWings implements FlyBehavior{
20
21     @Override
22     public void fly() {
23         System.out.println("I AM FLYING!");
24
25     }
26
27 }
28 /**
29  * 飞行行为的实现者,给不会飞的鸭子用
30  * @author Administrator
31  *
32  */
33 class FlyNoWay implements FlyBehavior{
34
35     @Override
36     public void fly() {
37         System.out.println("I CANT'T FLY!");
38
39     }
40
41 }
42 /**
43  * 增加一个火箭动力飞行行为
44  * @author Administrator
45  *
46  */
47 class RocketFly implements FlyBehavior{
48
49     @Override
50     public void fly() {
51         System.out.println("一飞冲天");
52
53     }
54
55 }

4.鸭子鸣叫行为接口

package com.pattern.strategy;
/*** 所有鸣叫行为类必须实现此接口* @author Administrator**/
public interface Quack {public void quack();}
//呱呱叫的行为实现
class QQuack implements Quack{@Overridepublic void quack() {System.out.println("quack quack!");}}
//吱吱叫的行为实现
class Squack implements Quack{@Overridepublic void quack() {System.out.println("ZHI ZHI");}}
/*** 不会叫的行为实现* @author Administrator**/
class Silence implements Quack{@Overridepublic void quack() {System.out.println("silence");}}

5.鸭子的实现类绿头鸭,会飞也会叫

package com.pattern.strategy;
/*** 鸭子的实现类,绿头鸭* @author Administrator**/
public class MallDuck extends Duck {public MallDuck() {super();fb = new FlyWithWings();//绿头鸭带翅膀会飞q  = new QQuack();//绿头鸭是呱呱叫// TODO Auto-generated constructor stub
    }@Overridepublic void display() {System.out.println("i am  a MallDuck");}}

6.鸭子实现类模型鸭子,不会飞,也不会叫

package com.pattern.strategy;
/*** 模型鸭子* @author Administrator**/
public class ModelDuck extends Duck {public ModelDuck() {super();fb = new FlyNoWay();q = new Silence();// TODO Auto-generated constructor stub
    }@Overridepublic void display() {System.out.println("我 是 模型 鸭子");}}

7.客户端测试代码

package com.pattern.strategy;
/*** 测试类,把行为看做一个算法族,算法代表鸭子能做的事,客户使用封装好的飞行和呱呱叫算法族* 这种做法就是组合,鸭子的行为不是继承来的,而是适当的行为对象组合来的,如FlyBehavior和Quack* 使用组合将算法组封装成类,可以运行时动态的改变行为* @author Administrator**/
public class Simulator {public static void main(String[] args) {Duck d = new MallDuck();d.performFly();d.performQuack();Duck model = new ModelDuck();model.performFly();//模型鸭子不会飞//我突然想让他飞model.setFb(new RocketFly());//运行时改变鸭子的行为,只需要调用set方法即可
        model.performFly();}}

8.测试结果

9.

常见开发中场景:
---JAVASE中GUI编程,布局管理
---Spring框架中,Resource接口,资源访问策略
---javax.servlet.http.HttpServlet#service();

posted on 2017-05-19 01:01 lovejobs 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/huipengbo/p/6876377.html

面向对象设计模式之策略模式相关推荐

  1. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  2. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  3. 橘子学设计模式之策略模式

    策略模式 1.简介 俗话说:条条大路通罗马.在很多情况下,实现某个目标的途径不止一条,例如我们在外出 旅游时可以选择多种不同的出行方式,如骑自行车.坐汽车.坐火车或者坐飞机,可根据实 际情况(目的地. ...

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

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

  5. 设计模式之策略模式详解

    设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有 ...

  6. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  7. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  8. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  9. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

最新文章

  1. GridView控件修改、删除示例(修改含有DropDownList控件)
  2. 通用工具之Pair和Tuple-《C++标准库(第二版)》读书笔记
  3. Semaphore 类
  4. NSIS设置桌面快捷方式的图标
  5. 重拾python Day 1
  6. iOS 采集音视频及写入文件
  7. tcp 组播_华为组播理论知识详解(二)
  8. 前端学习(2529):搭建中央管理
  9. linux x86 关机 过程,linux在x86上的中断处理过程(详细)
  10. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)
  11. Python爬虫_乱码、转码
  12. selenium 定位方式3-css_selector
  13. mysql一样的查询在我本地很快但是线上很慢_Mysql读写分离原理及主众同步延时如何解决...
  14. 关于局部变量的几个难点
  15. java xssf 字体样式_Apache POI字体/Fonts
  16. 操作系统课设实验五---Nachos文件系统扩展
  17. FireFox如何使用扩展
  18. rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
  19. 无源贴片晶振四角引脚_四脚贴片晶振有方向之分吗
  20. python乒乓球比赛规则介绍_乒乓球比赛的简要规则

热门文章

  1. ./configure make make install详解
  2. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListene解决办法
  3. Anroid View事件响应机制和ViewGroup的事件响应分发机制
  4. android 中文语音
  5. 使用Sonatype Nexus搭建Maven镜像的几点注意事项
  6. redmine-project.net vs redmine vs trac vs apis项目管理软件选型比较
  7. 使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型代替text、ntext 和 image 数据类型...
  8. python里面的工厂模式
  9. 打印杨辉三角(数组练习)
  10. ansible web_最小的Web浏览器,Microsoft Access替代品,Ansible,Kubernetes,JavaScript,piwheel等