△策略模式用于在用户行为经常发生变化的情况下,将行为单独提取出来,定义算法族,采用组合的方式,分别封装起来,让他们可以互相替换,此模式,让算法的变化独立于使用算法的客户。
该模式体现了如下设计模式的原则:
- 封装变化。
- 多用组合,少用继承。
- 针对接口编程,而不针对实现编程。
在策略模式中,第一点体现了对于类中变化的部分,进行了封装,第二部分体现了将算法族的接口定义在类中,采用组合的形式来完成对于类行为的定义,第三部分体现了利用借口代表每个行为,而将接口的具体实现交给其实现类来完成。下面是代码示例,采用了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图如下:
时间: 2024-10-25 04:53:52