【设计模式】策略模式

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
posted @ 2019-07-25 06:56  suyesean  阅读(93)  评论(0编辑  收藏  举报