设计模式之策略模式
程序员文章站
2024-02-09 16:41:34
...
策略模式:分别封装行为(算法)接口,超类里放行为(算法)接口,在子类里赋值具体行为(算法)对象。
原则:分离变化部分,封装接口,基于接口编程各种行为(算法)功能。
作用:此方法让行为(算法)的变化独立于行为(算法)的使用者。
文章目录
一 模拟鸭子的游戏
1、鸭子的抽象类
实现
public abstract class Duck {
public Duck() {
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
public void Fly() {
System.out.println("~~im fly~~");
}
}
2、鸭子的具体实现类
1)、GreenHeadDuck
public class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}
2)、RedHeadDuck
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
// public void Fly() {
// System.out.println("~~good fly~~");
// }
}
3)、StoneDuck
public class StoneDuck extends Duck {
@Override
public void display() {
System.out.println("**StoneDuck**");
}
public void Quack() {
System.out.println("~~no gaga~~");
}
public void swim() {
System.out.println("~~no swim~~");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}
3、以上遇到的问题、
当我们要扩展一个行为的时候,例如fly,
1、使用继承的时候,fly()的实现放在超类,优点是代码的复用,缺点是有功能溢出;
2、不使用继承的时候,fly()在各个子类中实现,缺点是代码复用性不好;
为解决以上两点,就用行为的组合,不用行为的继承;既满足代码复用,也满足不功能溢出。
二、分析问题的方法论
1)、分析问题的变化部分和不变部分,提取变化部分,抽象成接口+实现;
2)、鸭子哪些功能是会根据新需求变化的?叫声/飞行。。。
例如:
1、接口:
1)、飞行的接口:
public interface FlyBehavior{
void fly();
}
2)、叫声的接口
public interface QuackBehavior {
void quack();
}
3)好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑
三、策略模式的实现
1、增加行为接口的抽象Duck
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck() {}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
mQuackBehavior.quack();
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
2、行为接口及具体实现
1)、行为接口
public interface FlyBehavior {
void fly();`在这里插入代码片`
}
2)、BadFlyBehavior具体行为
public class BadFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
3)、GoodFlyBehavior具体行为
public class GoodFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
System.out.println("--GoodFly--");
}
}
4)、NoFlyBehavior具体行为
public class NoFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--NoFly--");
}
}
3、具体实现的GreenHeadDuck
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
mQuackBehavior = new GaGaQuackBehavior();
}
@Override
public void display() {
System.out.println("**GreenHead**");
}
}