策略模式的定义
定义了一系列算法,分别封装起来,让它们之间可以互相替换,让算法的变化独立于使用他们的客户
利用到的设计模式原则
- 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
- 针对接口编程,而不是针对实现编程
- 多用组合少用继承
UML类图
实现代码
- Duck.java (鸭子抽象类)
package duck;
/**
* 鸭子论之实现
*
* @author hjsjy
* @create 2018/10/9
* @since 1.0.0
*/
public abstract class Duck {
Flybehavior flybehavior;
Quackbehavior quackbehavior;
public void setQuackbehavior(Quackbehavior quackbehavior) {
this.quackbehavior = quackbehavior;
}
public void setFlybehavior(Flybehavior flybehavior) {
this.flybehavior = flybehavior;
}
public void PeformFly(){
flybehavior.fly();
}
public void PerformQuack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("我可以游泳!");
}
public abstract void display();
}
- Flybehavior.java (飞行行为接口)
public interface Flybehavior {
void fly();
}
- 飞行行为接口实现
public class FlyNoWay implements Flybehavior {
@Override
public void fly() {
System.out.println("不能飞!!!!!!");
}
}
- 飞行行为接口实现
*/
public class FlyOnSky implements Flybehavior {
@Override
public void fly() {
System.out.println("在天上飞!!!!!!!");
}
}
- Quackbehavior.java (鸭叫行为接口)
public interface Quackbehavior {
void quack();
}
- AQuack.java(鸭叫行为实现)
public class AQuack implements Quackbehavior {
@Override
public void quack() {
System.out.println("嘎嘎嘎!!!!!!!!!");
}
}
- NoQuack(鸭叫行为实现)
public class NoQuack implements Quackbehavior {
@Override
public void quack() {
System.out.println("没有声音!!!!!!!!");
}
}
- HjsjyDuck.java(实现鸭子抽象类)
public class HjsjyDuck extends Duck {
public HjsjyDuck(){
flybehavior=new FlyOnSky();
quackbehavior=new AQuack();
}
@Override
public void display() {
System.out.println("我是一直会游泳,会飞并且会嘎嘎嘎的鸭子!!!!!!!!!");
}
}
- DuckTest.java(鸭子测试类)
public class DuckTest {
public static void main(String[] args) {
Duck hjsjyDuck = new HjsjyDuck();
hjsjyDuck.display();
hjsjyDuck.swim();
hjsjyDuck.PeformFly();
hjsjyDuck.PerformQuack();
hjsjyDuck.setFlybehavior(new FlyNoWay());
hjsjyDuck.PeformFly();
}
}
输出结果
本文参考 :《Head First 设计模式》