设计模式之一

设计模式设计出来就是为了让后期维护代码更容易,增加代码的强壮性等好处!

策略模式

  自己的理解:定义一个算法族,分别分装起来,使他们能互相替换且算法的变换与使用算法的对象相互独立。简单来说是将变化的和不变得分离,对接口编程,不对实现编程(少用继承)。

 

下面举个例子:

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();
}
}

 

 

原文地址:https://www.cnblogs.com/xiaohuachen/p/8277299.html