策略模式
2016-04-11 20:41
357 查看
策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程;
3、多用组合,少用继承。
举例:
两种表现行为,即要实现两个算法族,封装为两个接口,分别是QuackBehavior和FlyBehavior接口:
通过封装具体的类分别实现两个接口,即实现具体的算法:
继承QuackBehavior接口的类有如下两个(可以理解为两种实现Quack的算法,一个算法族):
继承FlyBehavior接口的类有如下两个,两中实现Fly的算法:
定义Duck抽象类:
定义一个Duck类的子类MallardDuck:
建立一个测试类:
来自为知笔记(Wiz)
设计原则:
1、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程;
3、多用组合,少用继承。
举例:
两种表现行为,即要实现两个算法族,封装为两个接口,分别是QuackBehavior和FlyBehavior接口:
package com.nwpulisz.strategypattren; public interface QuackBehavior { public void quack(); }
package com.nwpulisz.strategypattren; public interface FlyBehavior { public void fly(); }
通过封装具体的类分别实现两个接口,即实现具体的算法:
继承QuackBehavior接口的类有如下两个(可以理解为两种实现Quack的算法,一个算法族):
package com.nwpulisz.strategypattren; public class Quack implements QuackBehavior { public void quack() { // TODO Auto-generated method stub System.out.println("Quack"); } }
package com.nwpulisz.strategypattren; public class MuteQuack implements QuackBehavior { public void quack() { // TODO Auto-generated method stub System.out.println("Mute Quck"); } }
继承FlyBehavior接口的类有如下两个,两中实现Fly的算法:
package com.nwpulisz.strategypattren; public class FlyNoWay implements FlyBehavior { public void fly() { // TODO Auto-generated method stub System.out.println("fly no way"); } }
package com.nwpulisz.strategypattren; public class FlyWithWings implements FlyBehavior { public void fly() { // TODO Auto-generated method stub System.out.println("fly with wings"); } }
定义Duck抽象类:
package com.nwpulisz.strategypattren; 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 setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
定义一个Duck类的子类MallardDuck:
package com.nwpulisz.strategypattren; public class MallardDuck extends Duck { public MallardDuck(){ quackBehavior=new Quack(); //构造器中指定行为类; flyBehavior= new FlyWithWings(); } @Override public void display() { // TODO Auto-generated method stub System.out.println("Mallar Duck"); } }
建立一个测试类:
package com.nwpulisz.strategypattren; public class DuckSimulator { public static void main(String[] args) { // TODO Auto-generated method stub Duck mallard = new MallardDuck(); mallard.performQuack(); //构造器中指定行为类,output:Quack; mallard.performFly(); //构造器中指定行为类,output:fly with wings; mallard.setFlyBehavior(new FlyNoWay()); //调用set方法,可以动态改变行为; mallard.setQuackBehavior(new MuteQuack()); //调用set方法,可以动态改变行为; mallard.performQuack(); //output:Mute Quck; mallard.performFly(); //output:fly no way; } }
来自为知笔记(Wiz)
相关文章推荐
- 山东省第一届ACM省赛 B SDUT 2152 Balloons(简单的BFS)
- Wireshark:图形化数据包捕获软件。
- 栈求解迷宫问题
- Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择
- c++ 链接mysql:error LNK2019: 无法解析的外部符号
- 完全卸载MySQL数据库
- CCF之消除类游戏
- jsp页面中的$(param.xxxxx)
- 近 100 个 Linux 常用命令大全
- “耐撕”团队 2016.04.11 站立会议
- application/x-www-form-urlencoded multipart/form-data text/plain 后台返回的数据响应的格式类型
- linux 安装jdk
- Matlab协助调试ROS程序: matlab2015b + ros indigo
- Convolutional Neural Networks卷积神经网络 (该博主一系列都很好)
- Problem I: 冒泡排序法排序
- 1127 最短的包含字符串
- 事件 信号量 互斥锁 临界区总结
- MySQL单列索引和联合索引
- Java集合框架复习之规则集Set-LinkedHashSet(四)
- PCA主成分分析