一.创建接口
Strategy.java
public interface Strategy {
public int doOperation(int num1, int num2);
public void print();
}
二.创建实现接口的实体类
OperationAdd.java
public class OperationAdd implements Strategy {
private int result = 0;
@Override
public int doOperation(int num1, int num2) {
result = num1 + num2;
return result;
}
@Override
public void print() {
System.out.println("OperationAdd print result : " + result);
}
}
OperationSubtract.java
public class OperationSubtract implements Strategy {
private int result = 0;
@Override
public int doOperation(int num1, int num2) {
result = num1 - num2;
return result;
}
@Override
public void print(){
System.out.println("OperationSub print result : " + result);
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy {
private int result = 0;
@Override
public int doOperation(int num1, int num2) {
result = num1 * num2;
return result;
}
@Override
public void print() {
System.out.println("OperationMultiply print result : " + result);
}
}
三.创建管理类
ContextManager.java
import java.util.List;
import java.util.Vector;
public class ContextManager {
private Object mLock = new Object();
private static ContextManager mInstance = null;
public static synchronized ContextManager getInstance() {
if (mInstance == null) {
mInstance = new ContextManager();
}
return mInstance;
}
private List<Strategy> mStrategyList;
private ContextManager() {
mStrategyList = new Vector<Strategy>();
}
public void deinit() {
if (mStrategyList != null) {
mStrategyList.clear();
}
}
public void registerOperationListener(Strategy listener) {
System.out.println("registerOperationListener: " + (listener == null));
synchronized (mLock) {
if (mStrategyList != null && listener != null
&& !mStrategyList.contains(listener)) {
mStrategyList.add(listener);
}
}
}
public void unregisterOperationListener(Strategy listener) {
System.out.println("unregisterOperationListener: " + (listener == null));
synchronized (mLock) {
if (mStrategyList != null && listener != null
&& !mStrategyList.isEmpty() && mStrategyList.contains(listener)) {
mStrategyList.remove(listener);
}
}
}
public void notifyOperation(int num1, int num2) {
System.out.println("notifyOperation");
synchronized (mLock) {
if (mStrategyList != null) {
int size = mStrategyList.size();
for (int i = 0; i < size; i++) {
Strategy listener= mStrategyList.get(i);
if (listener != null) {
listener.doOperation(num1, num2);
listener.print();
}
}
}
}
}
}
四.使用ContextManager利用vector来管理实际不同的策略
SrategyDemo.java
public class StrategyDemo {
public static void main(String [] args) {
Strategy strategyAdd = new OperationAdd();
Strategy strategySub = new OperationSubtract();
Strategy strategyMul = new OperationMultiply();
ContextManager mContextManager = ContextManager.getInstance();
mContextManager.registerOperationListener(strategyAdd);
mContextManager.registerOperationListener(strategySub);
mContextManager.registerOperationListener(strategyMul);
mContextManager.notifyOperation(200, 100);
System.out.println("========================================");
mContextManager.unregisterOperationListener(strategyAdd);
mContextManager.notifyOperation(300,100);
}
}
五.输出结果
registerOperationListener: false
registerOperationListener: false
registerOperationListener: false
notifyOperation
OperationAdd print result : 300
OperationSub print result : 100
OperationMultiply print result : 20000
========================================
unregisterOperationListener: false
notifyOperation
OperationSub print result : 200
OperationMultiply print result : 30000
本文展示了如何在Java中实现策略模式和观察者模式的结合。通过创建Strategy接口,实现了OperationAdd、OperationSubtract和OperationMultiply三个实体类,分别对应加法、减法和乘法操作。ContextManager类作为管理者,使用Vector存储并管理这些策略,并提供了注册、注销和通知操作的功能。在StrategyDemo主类中,展示了如何注册不同策略并进行计算操作,以及在执行通知时动态改变结果的输出。输出结果显示了策略的添加、移除以及对特定操作的响应。
767

被折叠的 条评论
为什么被折叠?



