设计模式之策略模式(笔记)
使用组合而不是继承
策略模式定义了一系列的算法,封装每个算法,让他们之间可以相互替换,策略模式让算法的变化独立于使用算法的客户。
策略模式使算法在客户使用时独立,解耦了算法和算法的使用者,使得我们可以在算法A、算法B、算法C之间任意切换,无论是使用哪一个算法,如果算法发生了改变,Client都不需要做出任何改变,如果想要修改其中一个算法,修改算法的实现,你可以不用同时修改使用它的用户,当客户端不需要做任何改动,类比集合的实现。
简单的策略模式
UML类图
他通过使用组合而非继承的方式来实现了代码的复用,作为一个使用了策略模式的类(Client),他持有者策略模式的接口类(IBahavior),这个抽象的策略类有各种不同的实现,当我们在构造Client的时候,就可以传入不同的接口实现类完成对IBahavior字段的初始化。
鸭子范例
public abstract class Duck {
FlyStrategy flyStrategy;
public Duck() {
}
public abstract void display();
public void performFly() {
flyStrategy.fly();
}
}
public interface FlyStrategy {
public void fly();
}
public class FlyNoWay implements FlyStrategy{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can not fly");
}
}
public class FlyWithWings implements FlyStrategy{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying");
}
}
public class MallarDuck extends Duck{
public MallarDuck() {
// TODO Auto-generated constructor stub
this.flyStrategy=new FlyNoWay();
//this.quackStrategy=new
}
@Override
public void display() {
// TODO Auto-generated method stub
}
}
public class Client {
public static void main(String[] args) {
MallarDuck mallarDuck = new MallarDuck();
mallarDuck.performFly();
}
}
rDuck.performFly();
}
}
[外链图片转存中...(img-w3JJBWrq-1635645273214)]