Java设计模式:
行为型模式共十一种,这十一种之间的关系见下图:
行为型模式.png
一、策略模式
策略模式是将实现某个功能的一系列算法和策略封装起来,让算法或策略的修改不影响调用。接下来我们实现一个简单的计算器功能,提供加、减、乘功能,代码如下:
计算器接口:
public interface Calculator {
int calculate(int a, int b);
}
加法实现:
public class Plus implements Calculator {
public int calculate(int a, int b) {
return a + b;
}
}
减法实现:
public class Minus implements Calculator {
public int calculate(int a, int b) {
return a - b;
}
}
乘法实现:
public class Multiply implements Calculator {
public int calculate(int a, int b) {
return a * b;
}
}
测试:
public class StrategyTest {
public static void main(String[] args) {
Calculator plus = new Plus();
Calculator minus = new Minus();
Calculator multiply = new Multiply();
int a = 5;
int b = 7;
System.out.println(a + " + " + b + " = " + plus.calculate(a, b));
System.out.println(a + " - " + b + " = " + minus.calculate(a, b));
System.out.println(a + " * " + b + " = " + multiply.calculate(a, b));
}
}
测试结果:
5 + 7 = 12
5 - 7 = -2
5 * 7 = 35
二、模板方法模式
模板方法是指定义一个操作中算法的骨架,而将具体操作定义到实现类中。我们仍以上面的计算器为例,代码如下:
计算器抽象类:
public abstract class AbstractCalculator {
public abstract int calculate(int a, int b);
public int exec(int a, int b) {
return calculate(a, b);
}
}
加法实现类:
public class Plus extends AbstractCalculator {
public int calculate(int a, int b) {
return a + b;
}
}
乘法实现类:
public class Multiply extends AbstractCalculator {
public int calculate(int a, int b) {
return a * b;
}
}
测试类:
public class Test {
public static void main(String[] args) {
AbstractCalculator plus = new Plus();
AbstractCalculator multiply = new Multiply();
int a = 5;
int b = 3;
System.out.println(a + " + " + b + " = " + plus.calculate(a, b));
System.out.println(a + " * " + b + " = " + multiply.calculate(a, b));
}
}
测试结果:
5 + 3 = 8
5 * 3 = 15
三、观察者模式
观察者模式,类似发布者与订阅者,当发布者发布消息的时候,其订阅者就能够收到,订阅者就是观察者。一旦被观察的对象有变化,观察者就会知道。我们给个简单的发布订阅者实例。
发布者:
public class Subscriber {
//所有观察者
List<IObserver> observerList = new ArrayList<IObserver>();
/**
* 添加观察者
*
* @param observer
*/
public void add(IObserver observer) {
observerList.add(observer);
}
/**
* 删除观察者
*
* @param observer
*/
public void remove(IObserver observer) {
observerList.remove(observer);