设计原则一
1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
把会变化的部分取出来“封装”起来,以便以后可以轻易改动或扩充此部分
设计原则二
针对接口编程,而不是针对实现编程
利用接口代表行为,比如鸭子的fly-behavior ,而行为的每个实现都将实现一个接口
设计原则三
多用组合,少用集成
策略模式
策略模式定义的算法族, 分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户
类似 鸭子的飞,叫的行为,有不同===> 算法的变化
基础类
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
/**
* 鸭子的外观
*/
public abstract void display();
/**
* 游泳
*/
public void swim() {
System.out.println("我游啊游啊游......");
}
/**
* 飞行
*/
public void performFly() {
//将飞行这件小事委托给行为类
if (flyBehavior != null)
flyBehavior.fly();
}
/**
* 设置鸭子的飞行行为
*
* @param flyBehavior 飞
*/
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
/** * 叫 */
public void performQuack() {
//将浪叫这件小事委托给行为类
if (quackBehavior != null)
quackBehavior.quack();
}
/**
* 设置鸭子叫的行为
*
* @param quackBehavior 叫
*/
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
总结,这里把鸭子叫,非的不确定行为抽象出来,使用 组合的方式组合起来
但是鸭子确定的行为就可以保留在基类里
public interface FlyBehavior {
/**
* 飞行
*/
void fly();
}
public interface QuackBehavior {
/**
* 叫
*/
void quack();
}
这里想实现怎么飞就怎么飞,用翅膀,坐飞机,坐火箭。这样就能达到代码复用,只用维护一份,
比如这里实现用翅膀飞
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("我飞起来了!!!");
}
}
实现一只绿头鸭
public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("我可是一只货真价实的野鸭子!");
}
}
测试
public static void main(String[] args) {
System.out.println("Hello World!");
Duck duck = new MallardDuck();
duck.swim();
duck.display();
duck.performFly();
duck.performQuack();
//现在会飞了
duck.setFlyBehavior(new FlyWithWings());
duck.performFly();
//可是不会叫了
duck.setQuackBehavior(new MuteQuack());
duck.performQuack();
}