策略模式

此文为《Head First 设计模式》章节1读书笔记。文中的编程实例为仿照书中示例编写的,感觉逻辑上稍有欠缺,但是整体上体现了策略模式的核心思想:动态应对需求变更。待日后遇到更恰当的例子再做更改。

OO基本特性

  • 抽象
  • 封装
  • 继承
  • 多态

OO设计原则

  • 封装变化:独立出应用中可能会变化的部分;
  • 多用组合,少用继承;
  • 针对超类型(SuperType)进行编程,而不是针对实现编程。

OO设计模式

策略模式

定义算法族,并将其分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

“继承”机制只适用于所有子类都具有和父类同样行为(共性行为)的情况,所以当某些子类不具有共性行为时,应该将之前是共性的行为从父类和所有子类中剔除(不能直接将共性行为声明为接口,让具有该行为的子类实现 -> 代码不能重用,造成代码重复),将共性行为抽象成接口(行为接口),并建立一组新类来代表每个具体行为类(行为子类),而原来的父类就可以将行为“委托”给行为子类处理(需要在父类中先声明行为接口类型的变量,调用共性行为方法,再在继承自父类的子类中用具体的行为子类进行赋值)。

示例

package me.yobol.designpattern.strategy;

/**
  * 行为接口
  */ 
public interface SpeakBehavior {

    public void speak();
}

package me.yobol.designpattern.strategy;

/**
  * 实现行为接口SpeakBehavior的具体行为类
  */
public class Speak implements SpeakBehavior {

    @Override
    public void speak() {
        System.out.println("I can speak commonly!");
    }
}
package me.yobol.designpattern.strategy;

/**
  * 实现行为接口SpeakBehavior的具体行为类
  */
public class Mute implements SpeakBehavior {

    @Override
    public void speak() {
        System.out.println("Wu la wu la...");
    }
}

package me.yobol.designpattern.strategy;

/**
  * 行为接口
  */
public interface WalkBehavior {

    public void walk();
}

package me.yobol.designpattern.strategy;

/**
  * 实现行为接口WalkBehavior的具体行为类
  */
public class Walk implements WalkBehavior {

    @Override
    public void walk() {
        System.out.println("I can walk commonly!");
    }
}

package me.yobol.designpattern.strategy;

/**
  * 实现行为接口WalkBehavior的具体行为类
  */
public class WalkWithStick implements WalkBehavior {

    @Override
    public void walk() {
        System.out.println("My beg hurt,so I walk with sticks");
    }
}

package me.yobol.designpattern.strategy;

/**
  * 父类
  */
public abstract class Person {

    public SpeakBehavior speakBehavior;
    public WalkBehavior walkBehavior;

    public void setSpeakBehavior(SpeakBehavior speakBehavior){
        this.speakBehavior = speakBehavior;
    }

    public void setWalkBehavior(WalkBehavior walkBehavior){
        this.walkBehavior = walkBehavior;
    }

    public abstract void represent();

    public void performSpeak(){
        speakBehavior.speak();
    }
    public void performWalk(){
        walkBehavior.walk();
    }
}

package me.yobol.designpattern.strategy;

/**
  * 继承自父类Person的子类
  */
public class CommonPerson extends Person {

    public CommonPerson() {
        this.speakBehavior = new Speak();
        this.walkBehavior = new Walk();
    }

    @Override
    public void represent() {
        System.out.println("I am so ugly!");
    }
}

package me.yobol.designpattern.strategy;

public class Main {

    public static void main(String[] args) {
        Person p = new CommonPerson();
        p.performSpeak();
        p.performWalk();
        p.setWalkBehavior(new WalkWithStick());
        p.performWalk();
    }
}

你可能感兴趣的:(策略模式)