此文为《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();
}
}
网友评论