设计模式设计出来就是为了让后期维护代码更容易,增加代码的强壮性等好处!
策略模式
自己的理解:定义一个算法族,分别分装起来,使他们能互相替换且算法的变换与使用算法的对象相互独立。简单来说是将变化的和不变得分离,对接口编程,不对实现编程(少用继承)。
下面举个例子:
Joe上班的公司做了一套相当成功的模拟鸭子游戏:SirmDuck。游戏中出现各种鸭子,一遍游泳,一遍呱呱叫。此系统的内部设计使用了标准的OO技术。设计了一个鸭子的超类(SuperDuck)并让各种鸭子继承此类。一天公司要求在水里游泳的鸭子要会飞。Joe毫不犹豫的将SuperDuck中添加了fly()方法。第二天Joe被叫进办公司问道,游戏中的橡皮鸭子在屏幕中飞来飞去。(《Head First 设计模式》里的翻版)
问题:只要继承了这个超类,都会飞。。而且后期如果加入别的不会叫的鸭子,也要动原始代码?
解决::利用策略模式。面向接口编程,将变的抽离出来。
以下是自己写的代码:
/**
* Created by Administrator on 2018/1/12.
* 将鸭子的飞的行为分离出来 先写这个行为,具体的怎么飞按照各鸭子的重写
*/
public interface FlyBehavior {
void fly();
}
/**
* Created by Administrator on 2018/1/12.
* 将鸭子的叫的行为分离出来
*/
public interface MaleBehavior {
void male();
}
public class NoFly implements FlyBehavior {
@Override
public void fly() {
//不会飞
System.out.println("我不会飞!");
}
}
public class CanFly implements FlyBehavior {
@Override
public void fly() {
//能飞
System.out.println("我会飞!");
}
}
public class CanMale implements MaleBehavior {
@Override
public void male() {
System.out.println("我会叫,叫起来 吱吱吱");
}
}
public class CanMale1 implements MaleBehavior {
@Override
public void male() {
System.out.println("我会叫 叫起来像 呱呱呱");
}
}
/**
* Created by Administrator on 2018/1/12.
* 鸭子的超类,每一个鸭子都要继承这个Duck
*/
public class Duck {
//鸭子有两个行为 飞和叫
FlyBehavior flyBehavior;
MaleBehavior maleBehavior;
public Duck(){
}
public void flyBehavior(){
flyBehavior.fly();
}
public void maleBehavior(){
maleBehavior.male();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setMaleBehavior(MaleBehavior maleBehavior) {
this.maleBehavior = maleBehavior;
}
}
public class ModulDuck extends Duck {
//可以在构造函数里去new 对应的行为。。然后在建鸭子的时候 new对应的鸭子即可
public ModulDuck(){
flyBehavior=new NoFly();
// maleBehavior=new
}
public void display(){
System.out.println("我是一只模型鸭子!");
}
}
//测试类
public class DuckTest {
public static void main(String[] args){
Duck duck=new Duck();
duck.setFlyBehavior(new CanFly());
duck.setMaleBehavior(new CanMale1());
duck.flyBehavior();
duck.maleBehavior();
Duck duck1=new Duck();
duck1.setMaleBehavior(new CanMale());
duck1.setFlyBehavior(new NoFly());
duck1.flyBehavior();
duck1.maleBehavior();
}
}