策略模式------《Head First 设计模式》
阅读原文时间:2023年07月10日阅读:2

第一章---策略模式

xzmxddx

  学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。

  • 封装变化

  • 多用组合,少用继承

  • 针对接口编程,不针对实现编程

  • 为交互对象之间的松耦合设计而努力

  • 类应该对扩展开放,对修改关闭

  • 依赖抽象,不要依赖具体类

  • 只和朋友交谈

  • 别找我,我会找你

  • 类应该只有一个改变的理由

      策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。

      我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可

      这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)

  eclipse截图:

  

  鸭子抽象类以及子类:

  Duck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyBehavior;
import hue.edu.xiong.first.quack.QuackBehavior;

public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public abstract void display();

public void performFly() {  
    flyBehavior.fly();  
}

public void performQuack() {  
    quackBehavior.quack();  
}

public void swim() {  
    System.out.println("All ducks float,even decoys!!");  
}

public void setFlyBehavior(FlyBehavior flyBehavior) {  
    this.flyBehavior = flyBehavior;  
}

public void setQuackBehavior(QuackBehavior quackBehavior) {  
    this.quackBehavior = quackBehavior;  
}  

}

  MallardDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyWithWings;
import hue.edu.xiong.first.quack.Quack;

public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}

@Override  
public void display() {  
    System.out.println("It is MallardDuck!!!");  
}

}

  ModelDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.Quack;

public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}

@Override  
public void display() {  
    System.out.println("It is ModelDuck!!!");  
}

}

   飞行行为接口,以及实现类

  FlyBehavior

package hue.edu.xiong.first.fly;

public interface FlyBehavior {
public abstract void fly();
}

  FlyNoWay

package hue.edu.xiong.first.fly;

public class FlyNoWay implements FlyBehavior {

@Override  
public void fly() {  
    System.out.println("I can't fly!!");  
}

}

  FlyRocketPowered

package hue.edu.xiong.first.fly;

public class FlyRocketPowered implements FlyBehavior {

@Override  
public void fly() {  
    System.out.println("I'm flying with a rocket!!");  
}

}  

  FlyWithWings

package hue.edu.xiong.first.fly;

public class FlyWithWings implements FlyBehavior {

@Override  
public void fly() {  
    System.out.println("I'm flying!!");  
}

}

  叫声接口,以及实现类

  QuackBehavior

package hue.edu.xiong.first.quack;

public interface QuackBehavior {
public abstract void quack();
}

   Quack

package hue.edu.xiong.first.quack;

public class Quack implements QuackBehavior {

@Override  
public void quack() {  
    System.out.println("Quack");  
}

}

MuteQuack

package hue.edu.xiong.first.quack;

public class MuteQuack implements QuackBehavior {

@Override  
public void quack() {  
    System.out.println("<< Silence >>");  
}

}

Squeak

package hue.edu.xiong.first.quack;

public class Squeak implements QuackBehavior {

@Override  
public void quack() {  
    System.out.println("Squeak");  
}

}

package hue.edu.xiong.first;

import hue.edu.xiong.first.duck.Duck;
import hue.edu.xiong.first.duck.MallardDuck;
import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.MuteQuack;

public class Main {

 public static void main(String\[\] args) {  
     //声明并实例化一只MallardDuck  
     Duck duck = new MallardDuck();  
     //测试已经封装的行为  
     duck.performFly();  
     duck.performQuack();  
     duck.display();  
     //更改已经封装的行为,策略模式要点  
     duck.setFlyBehavior(new FlyNoWay());  
     duck.setQuackBehavior(new MuteQuack());  
     //测试  
     duck.performFly();  
     duck.performQuack();  

// I'm flying!!
// Quack
// It is ֻMallardDuck!!!
// I can't fly!!
// << Silence >>
}

}

策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章