【设计模式】策略模式
1. 定义
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
2. 设计原则
- 封装变化
将变化的地方独立出来,不要与不变化的混杂在一起 - 多用组合,少用继承(more has,less extends)
- 针对接口编程,而不针对实现编程
3. 模式举例
不好的设计:
鸭子作为父类,各个鸭子分别实现父类并重写父类的方法,这样会导致不断重写很多类,出现各种各样的实现。陷入每增加一种鸭子就增加更多的实现。
良好的设计:
抽象出来两个功能接口,即飞和叫的接口。各种飞行方式和叫的方式分别实现接口。鸭子父类拥有这两个接口。不同的鸭子子类分别拥有不同的接口实现类。从而可以将这些算法组合成。
不好的设计 :
@startuml
Title "策略模式--糟糕的设计"
abstract class Duck
Duck <|-- MallarDuck
Duck <|-- ReadHeadDuck
Duck <|-- RubberDuck
class Duck {
+ public quack()
+ public swim()
+ public display()
+ public fly()
}
class MallarDuck{
+ public display()
}
class ReadHeadDuck{
+ public display()
}
class RubberDuck{
+ public quack()
+ public display()
}
@enduml
良好的设计--策略模式
@startuml
Title "策略模式--良好的设计"
interface FlyBehavior
interface QuackBehavior
abstract class Duck
Duck <|-- MallarDuck
Duck <|-- ReadHeadDuck
Duck <|-- RubberDuck
FlyBehavior <|.. FlyWithWings
FlyBehavior <|.. FlyNoWay
QuackBehavior <|.. Quack
QuackBehavior <|.. Squeak
QuackBehavior <|.. MuteQuack
Duck--> FlyBehavior
Duck--> QuackBehavior
abstract class Duck {
{field} FlyBehavior flyBehavior
{field} QuackBehavior quackBehavior
{method} swim()
{method} display()
{method} performQuack()
{method} performFly()
{method} setFlyBehavior()
{method} setQuackBehavior ()
}
interface FlyBehavior {
+ public fly()
}
interface QuackBehavior {
+ public quack()
}
class MallarDuck{
+ public display()
}
class ReadHeadDuck{
+ public display()
}
class RubberDuck{
+ public quack()
+ public display()
}
class FlyWithWings {
+ public fly()
}
class FlyNoWay{
+ public fly()
}
class Quack {
+ public quack()
}
class Squeak{
+ public quack()
}
class MuteQuack{
+ public quack()
}
@enduml