策略模式

   博客分类: 学习笔记 文章类型: 原创

策略模式

本文字数为 1388 字, 预计读完大约需要 4 分钟

策略模式

利用组合而不是继承来实现功能

定义了算法族,分别封装起来,让它们之间可以互相替换 此模式让算法的变化独立于使用算法的客户 利用组合,我们最大化了代码的复用

public abstract class Duck {
    // 利用组合将功能添加到鸭子类里面
    protected FlyBehavior flyBehavior;
    protected QuackBehavior quackBehavior;
    public Duck() {}
    
    // 每个鸭子的绘制显示方法,因为绘制方法不一致,所以给子类实现
    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 interface FlyBehavior {
     void fly();
 }
 
public class FlyWithWings implements FlyBehavior { 
     public void fly() {
         System.out.println("I’m flying!!");
     }
 }
 
public class FlyNoWay implements FlyBehavior {
     public void fly() {
         System.out.println("I can’t fly");
     }
}

// 定义鸭子叫的动作
public interface QuackBehavior {
    void quack();
}

public class Quack implements QuackBehavior {
    public void quack() {
        System.out.println("Quack");
    }
}

public class MuteQuack implements QuackBehavior {
    public void quack() {
        System.out.println("<< Silence >>");
    }
}
public class Squeak implements QuackBehavior {
    public void quack() {
        System.out.println("Squeak");
    }
}

// 实现具体的鸭子类
public class MallardDuck extends Duck {
    @Override
    public void display() {
        System.out.println("I'm a MallardDuck");
    }
    
    public MallardDuck() {
        this.flyBehavior = new FlyWithWings();
        this.quackBehavior = new Squeak();
    }
}

//测试我们创建的鸭子类
public class test {
    public static void main(String[] args) {
        Duck duck = new MallardDuck();
        duck.performFly();
        duck.performQuack();
        duck.display();
        duck.swim();
    }
}
  • 上一篇:雪山飞狐
  • 下一篇:装饰器模式