设计模式之行为型模式(五)策略模式

62 阅读2分钟

1.职责链模式 2.命令模式 3.迭代器模式 4.观察者模式 5.策略模式 6.模板方法模式 7.访问者模式 8.中介者模式 9.备忘录模式 10.状态模式

由于学习难度较大或相对用途较少 本章不会讲解7-10四种设计模式

接下来针对以上6种设计模式进行单独讲解

5 策略模式

5.1 定义

定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开。将算法的定义放在专门的策略类中,每个策略类封装了一种实现算法。使用算法的客户端针对抽象策略类进行编程。增加新的策略时,只需要扩展新的策略类即可。

5.2 UML图

image.png 从上面UML图中可以看出

Context为环境类是使用算法的角色,它在实现某个方法时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy为抽象策略类,它为所有的策略方法声明了抽象方法,是所有策略类的父类。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy为具体策略类,它实现了在抽象策略类中声明的算法。在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

5.3 代码实现

public class Context {  
    private Strategy strategy;  
  
    public Context(Strategy strategy) {  
        this.strategy = strategy;  
    }  
  
    public void process() {  
        strategy.algorithm();  
    }  
}
public interface Strategy {  
    void algorithm();  
}
public class ConcreteStrategyA implements Strategy {  
    @Override  
    public void algorithm() {  
        System.out.println("ConcreteStrategyA algorithm");  
    }  
}  
  
public class ConcreteStrategyB implements Strategy {  
    @Override  
    public void algorithm() {  
        System.out.println("ConcreteStrategyB algorithm");  
    }  
}
public class Client {  
    public static void main(String[] args) {  
        Context contextA = new Context(new ConcreteStrategyA());  
        contextA.process(); 
        Context contextB = new Context(new ConcreteStrategyB());  
        contextB.process(); 
    }  
}