策略模式(Strategy)

原创 2015年11月19日 08:26:24

1、策略模式设计原则

第一、找出应用需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混合在一起,将需要变化的部分和不需要变化的部分分别使用接口进行实现

然后将变化的接口注入到不需要变化的接口进行组合实现需求

第二、多用组合,少用继承

第三、使用接口编程

2、策略模式实现要素

第一、通过分离变化得出策略接口strategy

第二、strategy的实现类

第三、客户程序持有一个“strategy”

第四、在客户程序中选择、组合正确的strategy实现

 

实例展示:使用场景为鸭子产品有鸣叫和身体特征两个方法,但是他们有各自得飞行特征

鸭子抽象接口及子类:

/**
 *
 * 鸭子接口,有各种各样的鸭子,他们都会鸣叫,但是有些会飞行
 * */
public abstract class Duck {
 //鸭子的外观,由具体的子类去实现
 public abstract void display();
 //鸭子的鸣叫方法,父类实现公用的方式,特别的由子类重写该方法实现
 public void quack(){
  System.out.println("嘎嘎嘎");
 }
 private FlyingStrategy flyingStrategy;
 
 public void setFlyingStrategy(FlyingStrategy flyingStrategy) {
  this.flyingStrategy = flyingStrategy;
 }
 
 public void fly(){
  flyingStrategy.performFly();
 }
 
}

//大黄鸭
public class BigYellowDuck extends Duck{

 public BigYellowDuck() {
  // TODO Auto-generated constructor stub
  super.setFlyingStrategy(new FlyNoWay());
 }
 @Override
 public void display() {
  // TODO Auto-generated method stub
  System.out.println("我全身很黄,很大个");
 }
 //重写父类方法
 public void quack(){
  //此处也可以使用策略接口进行单独实现
  System.out.println("我不会叫");
 }

}

//绿脖鸭
public class GreenNeckDuck extends Duck{
 public GreenNeckDuck() {
  // TODO Auto-generated constructor stub
  super.setFlyingStrategy(new FlyWithWin());
 }
 @Override
 public void display() {
  // TODO Auto-generated method stub
  System.out.println("我的脖子是绿色的");
 }

}

//橡胶鸭
public class OakDuck extends Duck{
 public OakDuck() {
  // TODO Auto-generated constructor stub
  super.setFlyingStrategy(new FlyNoWay());
 }
 @Override
 public void display() {
  // TODO Auto-generated method stub
  System.out.println("我是橡胶做的");
 }
 //重写父类方法
 public void quack(){
  System.out.println("嘎~嘎~嘎~");
 }

}

//红头鸭
public class RedHeadDuck extends Duck{
 public RedHeadDuck() {
  // TODO Auto-generated constructor stub
  super.setFlyingStrategy(new FlyWithWin());
 }
 @Override
 public void display() {
  // TODO Auto-generated method stub
  System.out.println("我的头是红色的");
 }

}

//太空鸭
public class SpaceDuck extends Duck{
 public SpaceDuck() {
  // TODO Auto-generated constructor stub
  super.setFlyingStrategy(new FlyWithRocket());
 }
 @Override
 public void display() {
  // TODO Auto-generated method stub
  System.out.println("我头戴宇航头盔");
 }
 public void quack(){
  System.out.println("我通过无线电与你通信");
 }
 
}

策略接口及实现:

//策略接口,实现飞行方式
public interface FlyingStrategy {
 public void performFly();
}

//用火箭飞行
public class FlyWithRocket implements FlyingStrategy{

 @Override
 public void performFly() {
  // TODO Auto-generated method stub
  System.out.println("通过火箭飞行");
 }

}

//不会飞行
public class FlyNoWay implements FlyingStrategy{

 @Override
 public void performFly() {
  // TODO Auto-generated method stub
  System.out.println("不会飞行");
 }

}

//用翅膀飞行
public class FlyWithWin implements FlyingStrategy{

 @Override
 public void performFly() {
  // TODO Auto-generated method stub
  System.out.println("振翅高飞");
 }
 
}

 

3、策略模式的优点

第一、使用了组合,使框架更加灵活

第二、富有弹性,可以较好的应对变化(开-闭原则)

第三、更好的代码复用性(相对于继承)

第四、消除大量的条件语句

4、策略模式的缺点

第一、客户端需要了解每个策略实现的细节

第二、增加了对象的数目

5、策略模式的适用场景

第一、许多相关的类仅仅是行为差异

第二、运行时选取不同的算法变体

第三、通过条件语句在多个分支中选取

版权声明:本文为博主原创文章,未经博主允许不得转载。

浅谈JAVA设计模式之——策略模式(Strategy)

一、概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • l1028386804
  • l1028386804
  • 2015年05月09日 14:02
  • 1892

设计模式--深度解析策略模式(Strategy Pattern)

前些天网购一本Head First Design Patterns,学习了一下,觉得写的挺好,而且挺有趣的,推荐大家都去买一本,真心不错。在这里我先讲一下,这两天学的,两个常见的设计模式,分别Stra...
  • qq_29282475
  • qq_29282475
  • 2015年12月04日 14:17
  • 3556

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通...
  • LCL_data
  • LCL_data
  • 2013年08月24日 10:59
  • 12925

C++设计模式<四>:策略模式(Strategy)

1.动机在软件构件过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。2.模式定义定义一系列算法,把它们...
  • MonroeD
  • MonroeD
  • 2016年04月08日 01:16
  • 397

设计模式:策略模式(Python)

策略模式(Strategy Pattern): 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 原则: 针对接口(...
  • ericzhong83
  • ericzhong83
  • 2012年05月17日 23:53
  • 4904

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016年09月07日 21:16
  • 1112

策略模式(Strategy 模式)

一、概述策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。二、结构  策略模...
  • l_lhc
  • l_lhc
  • 2016年02月18日 12:23
  • 403

策略模式(Strategy Pattern)就这么简单

0x00 举个生活中的例子某个大人网站是会员制的,金牌会员购买精神食粮打7折,银牌会员打8折,铜牌会员打9折,铁牌会员不打折。也就是说不同的用户在购买精神食粮的时候结算的价格是不一样的,即使你们买相同...
  • fiendvip
  • fiendvip
  • 2016年04月12日 21:18
  • 4253

策略模式及C++实现

策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern d...
  • mafuli007
  • mafuli007
  • 2012年02月07日 15:41
  • 5824

Strategy模式和Template Method模式的异同浅析

一、Strategy模式 1. 特点说明: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。适用场景: 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • aheroofeast
  • aheroofeast
  • 2011年08月19日 20:16
  • 3102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:策略模式(Strategy)
举报原因:
原因补充:

(最多只允许输入30个字)