设计方式之(一)-策略模式(strategy)

设计模式之(一)-策略模式(strategy)

 

         策略模式教我们怎么用组合来解决一些继承(当中的问题。那就是我们没有办法用继承来封装变化的行为。继承只能提取类的公共行为和属性,但是似乎对于变化的行为无计可施。在策略模式里就涉及了我们的OO的设计原则一些设计原则:

1. 封装变化。分析系统的变化因素加以封装。

2. 多用组合,少用继承。组合能封装变化建立弹性的系统,还能在运行时改变对象的行为。

3. 对接口编程而不是对类编程。用组合封装行为的时候要让其实现接口,这样就可以对一个统一的接口类型编程了。

下面举例说明:

这里我们举个家用电器的例子,我们用一个电器的基类,封装所有家用电器公共的方法(开机和关机)。

设计方式之(一)-策略模式(strategy)

 

现在我们有冰箱,空调,洗衣机继承电器类。

 

 设计方式之(一)-策略模式(strategy)

但是现在对于一些变化的行为我们就没有办法封装了,比如空调的制冷,冰箱的制冷,洗衣机的洗衣操作。但是我们通过组合可以做到。我们在电器基类里组合制冷和洗衣。

设计方式之(一)-策略模式(strategy)

 

但是这样的话我们似乎没有办法空调的制冷和冰箱的制冷并且没有办法动态的改变Wiring里两个属性的值。我们可以让制冷和洗衣继承接口从而对接口类型操作。(顺便说一句,Visio里的类图好像不是那么好用,换用magicDraw画一个,呵呵)

设计方式之(一)-策略模式(strategy)

 

我们可以对Wiring类的两个属性加set方法,这样就可以在运行时改变行为了。再加两个执行动作方法perReg(),perWash()。

Public  void perRef(){

         regfrigreate.refrigreate();

}

Public void prewash(){

         wash.wash();

}

测试代码:

Wiring ref = new Refrigreate();

ref.setRefrigreate(new SaveRef());

ref.perRef();

ref.setRefrigreate(new AirRef());

ref.perRef();

这样我们就可以加很多实现接口的类用,而不会要修改Wiring类了。

最后在重复OO设计的其中三个原则:封装变化。多用组合,少用继承。对接口编程而不对类编程。