设计模式-策略模式

阅读HeadFirst设计模式一书,总结

策略模式

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

UML图

步骤

1.因为不同的鸭子拥有不同的飞和叫的行为,因此需要将这2个行为专门提取出来,创建对应的接口,方便以后的扩展,不同接口定义不同的实施方法,之后所有飞或叫的行为都需要实现各自的接口,并实现这个实施方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
---------------------------------------------------接口
public interface flyBehavior {
void performFly();
}

public interface quackBehavior {
void performQuack();
}
---------------------------------------------------实现类
public class MuteQuack implements quackBehavior {
@Override
public void performQuack() {
System.out.println("什么都不会叫");
}
}
public class Quack implements quackBehavior{
@Override
public void performQuack() {
System.out.println("呱呱叫");
}
}

public class FlyWithWings implements flyBehavior {
@Override
public void performFly() {
System.out.println("鸭子飞");
}
}
public class FlyNoWay implements flyBehavior {
@Override
public void performFly() {
System.out.println("不会飞");
}
}

2.编写Duck总类,即所有的鸭子最后都要继承于它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public abstract class Duck {
/**
* flyBehavior 飞行为接口
* quackBehavior 叫行为接口
*/
flyBehavior flyBehavior;
quackBehavior quackBehavior;

public void performQuack() {
// 不亲自处理 而是委托给quackBehavior
quackBehavior.performQuack();
}

public void performfly() {

flyBehavior.performFly();
}
/**
* setFlyBehavior 动态改变鸭子的飞行为
* setQuackBehavior 动态改变鸭子的叫行为
*/
public void setFlyBehavior(flyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}

public void setQuackBehavior(quackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
//每个鸭子不同的行为,继承鸭子总类之后必须覆盖该方法
abstract void display();
}

3.编写鸭子的继承类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MallarDuck extends Duck {

public MallarDuck() {
//这边quackBehavior和flyBehavior则为父类定义的接口对象
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
quackBehavior.performQuack();
flyBehavior.performFly();
}

@Override
void display() {
System.out.println("会叫会飞的鸭子");
}
}

4.编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String[] args) {
Duck duck = new MallarDuck();
System.out.println("--------------------");
//动态设置行为
duck.setFlyBehavior(new FlyNoWay());
duck.setQuackBehavior(new MuteQuack());
duck.performQuack();
duck.performfly();
}
}
Console显示
呱呱叫
鸭子飞
--------------------
什么都不会叫
不会飞
赏个🍗吧
0%