创建型模式
结构型模式
行为型模式
策略模式
首先,定义一个策略接口:
java
public interface Strategy {
public void draw(int radius, int x, int y);
}
然后定义具体的几个策略:
java
public class RedPen implements Strategy {
@Override
public void draw() {
System.out.println("red pen");
}
}
public class YellowPen implements Strategy {
@Override
public void draw() {
System.out.println("yellow pen");
}
}
public class BluePen implements Strategy {
@Override
public void draw() {
System.out.println("blue pen");
}
}
使用策略的类:
java
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int excuteDraw(int radius, int x, int y) {
return strategy.drwa(radius, x, y);
}
}
客户端演示:
java
public static void main(String[] args) {
// 使用蓝笔画画
Context context = new Context(new BluePen());
context.excuteDraw(84, 62, 063);
}
图示:

观察者模式
首先,定义主题,每个主题需要持有观察者列表的引用,用于在数据变更的时候通知各个观察者:
java
public Class Subject {
private List<Observer> observerList = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
// 数据变更 通知观察者们
notifyAll();
}
// 注册观察者
public void addObserver(Observer observer) {
observerList.add(observer);
}
// 通知观察者们
public void notifyAll() {
for (Observer observer : observerList) {
observer.update();
}
}
}
定义观察者接口:
java
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
定义具体的2个观察者类:
java
// 二进制观察者
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.addObserver(this);
}
// 本方法由主题类在数据变更时进行调用
@Override
public void update() {
System.out.println("数据变化!对应的二进制变为:result");
}
}
// 十六进制观察者
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.addObserver(this);
}
@Override
public void update() {
System.out.println("数据变化!对应的十六进制变为:result");
}
}
客户端演示:
java
public static void main(String[] args) {
// 先定义一个主题
Subject subject = new Subject();
// 定义观察者
new BinaryObserver(subject);
new HexaObserver(subject);
// 模拟数据变更 这个时候 观察者们的uodate方法会被调用
subject.setState(8462063);
}