In Strategy Pattern, the behavior of a class or its algorithm can be changed at run time. This type of design pattern belongs to behavioral pattern.
In the policy pattern, we create objects representing various policies and a context object whose behavior changes with the change of policy objects. The policy object changes the execution algorithm of the context object.
introduce
Intention: define a series of algorithms, encapsulate them one by one, and make them interchangeable.
Main solution: when there are many similar algorithms, use if Else brings complexity and difficult to maintain.
When to use: a system has many classes, and what distinguishes them is their direct behavior.
How to solve it: encapsulate these algorithms into classes one by one and replace them arbitrarily.
Key code: implement the same interface.
Application examples: 1. Zhuge Liang's knapsack, each knapsack is a strategy. 2. The way of travel, choose to ride a bike, take a car, each way of travel is a strategy. 3. LayoutManager in JAVA AWT.
Advantages: 1. The algorithm can be switched freely. 2. 2. Avoid using multiple conditional judgments. 3. Good scalability.
Disadvantages: 1. The number of policy classes will increase. 2. All policy classes need to be exposed.
Usage scenario: 1. If there are many classes in a system, and the only difference between them is their behavior, then using the policy pattern can dynamically make an object choose one behavior among many behaviors. 2. A system needs to dynamically choose one of several algorithms. 3. If an object has a lot of behaviors, without appropriate patterns, these behaviors can only be realized by multiple conditional selection statements.
Note: if a system has more than four policies, you need to consider using mixed mode to solve the problem of policy class expansion.
realization
We will create a Strategy interface that defines the activity and an entity policy class that implements the Strategy interface. Context # is a class that uses a certain Strategy.
StrategyPatternDemo, our demo class uses Context and policy object to demonstrate the behavior change of Context when the policy it configures or uses changes.
Step 1
Create an interface.
public interface Strategy { public int doOperation(int num1, int num2); }
Step 2
Create an entity class that implements the interface.
(1) Addition implementation class
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
(2) Subtraction implementation class
public class OperationSubtract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
(3) Multiplication implementation class
public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
Step 3
Create Context class and use class
public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } }
Step 4
Use Context to see the behavior changes when it changes Strategy.
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
Step 5
Execute the program and output the results:
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50