设计模式整理_策略模式

  △策略模式用于在用户行为经常发生变化的情况下,将行为单独提取出来,定义算法族,采用组合的方式,分别封装起来,让他们可以互相替换,此模式,让算法的变化独立于使用算法的客户。

       该模式体现了如下设计模式的原则:

  1. 封装变化。
  2. 多用组合,少用继承。
  3. 针对接口编程,而不针对实现编程。

  在策略模式中,第一点体现了对于类中变化的部分,进行了封装,第二部分体现了将算法族的接口定义在类中,采用组合的形式来完成对于类行为的定义,第三部分体现了利用借口代表每个行为,而将接口的具体实现交给其实现类来完成。下面是代码示例,采用了Duck类,其中将可能会发生变化的类单独分离成FlyBehavior接口和QuackBehavior接口,然后再实现类中定义接口的行为。在Duck类中,采用将两个接口组合的方式,定义行为,由于类存在不需要变化的行为参数,因此Duck类设置为abstract。在Demo演示的时候,先是演示ModelDuck,随后改变其FlyBehavior。

    Duck类即子类:

 

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public Duck(){}
    public abstract void display();
    public void performFly() {
        flyBehavior.fly();
    }
    public void performQuack() {
        quackBehavior.quack();
    }
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}
class ModelDuck extends Duck{
    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior=new Quack();
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("I am a Model Duck.");
    }
    
}

  FlyBehavior类即子类(可能变化的算法族)

 

public interface FlyBehavior {
    public void fly();
}
class FlyWithWings implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I am flying!");
    }
}
class FlyNoWay implements FlyBehavior {

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I can't fly.");
    }
    
}
class FlyWithRocket implements FlyBehavior {

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I am flying with Rocket!");
    }
    
}

  QuackBehavior类即子类(可能变化的算法族)

public interface QuackBehavior {
    public void quack();
}
class Quack implements QuackBehavior {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Quack");
    }
    
}
class MuteQuack implements QuackBehavior {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Silence.");
    }
    
}

  演示类:

public class Demo {
    public static void main(String[] args) {
        Duck duck=new ModelDuck();
        duck.performFly();
        duck.performQuack();
        duck.display();
        duck.setFlyBehavior(new FlyWithRocket());
        duck.performFly();
    }
}

 UML图如下:

原文地址:https://www.cnblogs.com/hlhdidi/p/5596396.html