策略模式(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、策略模式的适用场景

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

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

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

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

相关文章推荐

strategy策略模式源码

  • 2010年02月23日 14:25
  • 3KB
  • 下载

策略模式(Strategy)

  • 2012年06月05日 11:39
  • 2KB
  • 下载

Java Design Patterns--Strategy Pattern --策略模式

一.创建接口 public interface Strategy { public int doOperation(int num1, int num2); } 二.创建具体的实现类,实现St...

每天感悟总结-策略模式Strategy

  • 2009年03月10日 09:59
  • 4KB
  • 下载

Strategy 策略模式

意图:     定义了算法家族,分别封装起来让它们之间可以互相替换,此模式让算法的变化不会影响 到使用算法的客户。 结构: 代码: abstract class Strategy{ public ...

策略模式Strategy

  • 2014年06月13日 08:35
  • 15KB
  • 下载

例说策略模式(Strategy Pattern)

策略模式       这个模式被HEAD FIRST 设计模式放到了第一章,重要性可见一斑,类似于日常理解的“委托"概念,客户发布了一个需求,任何能满足这个需求的都可以来争取成为"代理人",通过代理人...
  • klpchan
  • klpchan
  • 2013年09月29日 18:16
  • 1165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:策略模式(Strategy)
举报原因:
原因补充:

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