博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式---策略模式Strategy Pattern
阅读量:6368 次
发布时间:2019-06-23

本文共 2260 字,大约阅读时间需要 7 分钟。

策略模式

定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim)。如何实现各种不同的鸭子的不同的表现。

解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法中,首先的问题是代码需要在子类中重复的编写,而且运行时的行为不容易被改变等等。

第二种方法会是接口,把fly()和quack()从鸭子类中提取出来。写成一个接口,能实现的鸭子实现接口,反之,则不实现接口,但是,这种方法会导致代码无法重复的利用。

第三 策略模式,把鸭子类中可变的行为分别抽取出来,分别封装起来。

见图:

  

 

代码实现:

Duck类:

public abstract class Duck {		FlyBehavior flyBehavior;	QuackBehavior quackBehavior;		public abstract void display();		public void swim(){		System.out.print(" swim ");	}	public void performFly() {		flyBehavior.fly();	}		public void performQuack(){		quackBehavior.quack();	}		public void setFlyBehavior(FlyBehavior fb){		this.flyBehavior = fb;	}		public void setQuackBehavior(QuackBehavior qb){		this.quackBehavior = qb;			}}

  fly接口及实现:

public interface FlyBehavior {	public void fly();}public class FlyWithWings implements FlyBehavior {		public void fly(){		System.out.print(" fly with wings ");	}}public class FlyNoWay implements FlyBehavior{		public void fly(){		System.out.print(" cant't fly ");	}}

  quack接口及实现:

public interface QuackBehavior {		public void quack();}public class Quack implements QuackBehavior{		public void quack(){		System.out.print(" quack");			}	}public class BadQuack implements QuackBehavior{		public void quack(){				System.out.print(" cant't quack ");	}}

  测试:

public class GreenDuck extends Duck{		public GreenDuck(){		flyBehavior = new FlyWithWings();		quackBehavior = new Quack();	}	public void display() {		System.out.print(" real duck ");			}}public class test {		public static void main(String []args){				Duck greenDuck = new GreenDuck();		greenDuck.performFly();		greenDuck.performQuack();		greenDuck.setFlyBehavior(new FlyNoWay());//动态改变鸭子的行为		System.out.println();		greenDuck.performFly();	}}

  结果:

 

总结与分析(摘自)

1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

 

转载于:https://www.cnblogs.com/zyqBlog/p/5287105.html

你可能感兴趣的文章
UIScrollView 大概是如何实现的,它是如何捕捉、响应手势的?
查看>>
asp.net MVC中实现调取web api
查看>>
keepalived实现服务高可用
查看>>
iOS模型以及使用
查看>>
NSString 去除空格
查看>>
swift - 网络请求数据处理 - 协议处理
查看>>
[BZOJ1588]营业额统计(Splay)
查看>>
[BZOJ 4869][SHOI&SXOI2017]相逢是问候(扩展欧拉定理+线段树)
查看>>
2017-08-13
查看>>
条件语句优化面面观
查看>>
集成友盟微信登录没有回调
查看>>
在CentOS Linux系统上,添加新的端口,启用ssh服务
查看>>
dbcp数据库连接池简单使用
查看>>
leetcode-38-Count and Say
查看>>
从零开始写一个node爬虫(上)—— 数据采集篇
查看>>
java调用远程服务器shell脚本
查看>>
贪吃蛇
查看>>
前端MVC学习总结(四)——NodeJS+MongoDB+AngularJS+Bootstrap书店示例
查看>>
Myeclipse快捷键集合
查看>>
linux安装ftp
查看>>