策略模式(Strategy Pattern)

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
 
几个设计原则:
1、把会变化的部分取出并 封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分;
2、针对 接口编程,而不是针对实现编程。这样就可以在“运行时”动态地“改变”行为。(因为接口中的方法可以通过不同的类实现,在运行时再调用各种不同的实现的类);
3、多用 组合,少用 继承。这样可以获得更大的弹性。
以上三点实际是相互联系的, 封装即用到 接口,用不同的类实现接口中定义的方法,让其他类使用,即 组合
 
我突然想到了“DAO”,还不是很了解,有空研究下。
 
在第一章的例子中:鸭子继承Duck,飞行行为实现FlyBehavior接口,呱呱叫行为实现QuackBehavior接口。文中的“一组行为”更为通俗的说法为“ 一族算法”。

 
本章所有代码如下:
 
FlyBehavior接口(FlyBehavior.java):
public interface FlyBehavior {
 public void fly();
}
 
实现Flybehavior接口的三个类:
FlyWithWings.java
public class FlyWithWings implements FlyBehavior {
 public void fly(){
  System.out.println("I'm flying !!!");
 }
}
 
FlyNoWay.java
public class FlyNoWay implements FlyBehavior{
 public void fly(){
  System.out.println("I can't fly.");
 }
}
 
FlyRocketPowered.java
public class FlyRocketPowered implements FlyBehavior{
 public void fly(){
  System.out.println("I'm flying with a rocket!");
 }
}
 
QuackBehavior接口:
public interface QuackBehavior {
 public void quack();
}
 
实现QuackBehavior接口的三个类:
Quack.java
public class Quack implements QuackBehavior{
 public void quack(){
  System.out.println("Quack");
 }
}
 
Squeak.java
public class Squeak implements QuackBehavior{
 public void quack(){
  System.out.println("Squeak");
 }
}
 
MuteQuack.java
public class MuteQuack implements QuackBehavior{
 public void quack(){
  System.out.println("<< Silence >>");
 }
}
 
Duck抽象超类(Duck.java):
public abstract class Duck {
 
 FlyBehavior flybehavior;
 QuackBehavior quackbehavior;
 
 public abstract void display();
 
 public void performFly(){
  flybehavior.fly();
 }
 
 public void performQuack(){
  quackbehavior.quack();
 }
 
/*为了可以在运行时动态地设定行为*/
 public void setFlyBehavior(FlyBehavior fb){
  flybehavior = fb;
 }

 /*为了可以在运行时动态地设定行为*/
 public void setQuackBehavior(QuackBehavior qb){
  quackbehavior = qb;
 }
 
 public void swim(){
  System.out.println("All duck float, even decoys !");
 }
}
MallardDuck子类(MallardDuck.java)
public class MallardDuck extends Duck{
 
 public MallardDuck(){
  this.quackbehavior = new Quack();
  this.flybehavior = new FlyWithWings();
 }
 
 public void display(){
  System.out.println("I'm a real Mallard duck");
 }
}
 
ModelDuck子类(ModelDuck.java)
public class ModelDuck extends Duck{
 public  ModelDuck(){
  this.flybehavior = new FlyNoWay();
  this.quackbehavior = new Quack();
 }
 public void display(){
  System.out.println("I'm a model duck");
 }
}
 
主文件MiniDuckSimulator.java
public class MiniDuckSimulator {
 public static void main(String[] args){
  Duck mallard = new MallardDuck();
  mallard.performQuack();
  mallard.performFly();
  
  Duck model = new ModelDuck();
  model.performFly();
  System.out.println("Now, reset fly behavior...");
  model.setFlyBehavior(new FlyRocketPowered());        //动态地改变行为
  System.out.println("Fly behavior resetted !");
  model.performFly();
 }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值