1. 把应用中那些可能会变化的部分独立出来,不要和那些不需要变化的代码混在一起。
  • 把会变的代码抽取出来封装,以便以后可以轻易改动或者扩充,而不需要影响变化的其他部分
  1. 针对接口编程,而不是针对实现编程
  • 不需要知道行为的实现细节
  • 利用接口代表行为,比如鸭子的飞抽象一个接口FlyBehavior,而每个行为的实现都将实现其对应接口
  • 如果面向实现编程,则行为来自超类Duck的具体实现,或是继承某个接口并由子类自行实现而来,这样会被实现耦合,没办法更改行为,除非写更多代码。

image.png

  • 这样的话,鸭子的子类使用接口表示行为,实现不会被绑死在鸭子的子类上
  1. 多用组合,少用继承
  • 有一个比是一个更好!

策略模式定义

定义算法族,分别封装起来,让他们可以相互替换,此算法让算法的变化独立于使用算法的客户。

针对接口编程

其含义是:针对超类型编程!
利用多态,程序根据实际情况执行子类的代码,不会绑定到超类型的行为上。
在运行时候才执行具体实现的对象。

image.png

现在鸭子可以将飞行和呱呱叫委托给别人处理,而不是使用定义在Duck类内的呱呱叫和飞行方法。

  1. 在Duck类中加入两个实例变量,flyBehavior,quackBehavior行为。
    1. image.png
  2. 再实现performQuack()的行为

    1. public class Duck(){
    2. QuackBehavoir quackBehavior;
    3. public void performQuack(){
    4. quackBehavior.quack();
    5. }
    6. }

    image.png

  3. 设定实例变量

image.png

  1. image.png

适用范围

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

例子:
在人这个类中,人说什么语言,只需要在类中包含一个语言接口对象就可以了,不需要用代码具体制定说英语还是汉语,在说话时候传入实现语言接口的对象赋值给刚才那个对象就可以了,使用那个接口对象的speak方法来进行说话就行.