Java 23种设计模式之策略模式
一堆废话,请无视:
做了几年程序员,感觉自己欠缺的很多,而且年近30来自于各方面的压力都促使我迫切的提高自己。
1.考驾照中
2.每天英语打卡
3.每天看点书(在这里做笔记)
4.骑自行车上下班(锻炼身体,很多前辈都是前车之鉴)
策略模式
1.一个模拟鸭子的简单应用
Joe做了一个模拟鸭子的游戏:SimUDuck.游戏中会出现各种鸭子,一边游泳,一边呱呱叫。
2.让鸭子飞起来
主管要求,让鸭子飞起来,Joe在Duck中增加了fly()方法。
那么问题来了,现在橡皮鸭RubberDuck中也飞来飞去,并且是会吱吱叫,不会呱呱叫
Joe想通过继承,复写fly()和quack()方法,但是随着产品的增加,需要覆盖所有的fly()和quack()方法。。。。。。简直是无穷无尽的噩梦。
使用接口怎么样,把“飞“和“叫”分别放进两个接口“Flyable”,“Quackable”,
但是使用接口可以解决重复的问题,缺点是造成了代码无法复用
第一个设计原则
3.分开变化和不会变化的部分
fly()和quack()方法会随着鸭子的变化而变化,因此将2个方法提取出来,建立一组新类代表两个行为:FlyBehavior,QucakBehavior.
第二个设计原则
通过接口可以动态的改变鸭子的行为,而且,fly和quack的具体实现不会绑死在鸭子类中
鸭子的行为:
这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。
而我们可以新增一些行为,不会影响到既有的行为类,也不会影响到“使用”到飞行行为的鸭子类。
4.整合鸭子的行为
1)在Duck类中增加两个实例变量
2)实现performQuack()
3) 实现perofrmFly()
代码如下:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
4)在MallarDuck类中的应用
FlyBehavior接口和其实现类
4.动态设定鸭子的行为
建立了一堆动态功能而没有使用,可以在鸭子子类中通过“setter”方法,来设定鸭子的行为,而不是在构造器内实例化
在Duck类中增加两个新方法
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
5.封装行为的大局观
不再把鸭子的行为说成“一组行为”,而是“一族算法”
重新设计后的类结构:
第三个设计原则
6.总结
策略设计模式定义了算法族,分别封装起来,让他们之前可以相互替换,此模式让算法的变化独立于使用算法的客户。
PS:在java中,ArrayList的sort(Comparator<? super E> c)应用的就是策略模式,根据传入的比较器,决定排序的方式
以上,HeadFirst第一篇读书笔记。