1、观察者模式:
/** * 抽象观察目标 */ public abstract class Subject { protected ArrayList<Observer> observers=new ArrayList<>();//定义一个观察者集合用于存储所有观察对象 //注册方法,用于向观察者集合中添加一个观察者 public void attach(Observer observer){ observers.add(observer); } //注销方法,用于在观察者集合中删除一个观察者 public void detach(Observer observer){ observers.remove(observer); } //抽象通知方法 public abstract void notifyObserver(); } /** * 具体观察目标 */ public class ConcreteSubject extends Subject { //通知所有观察者 @Override public void notifyObserver(){ for(Object obs:observers){ ((Observer)obs).update(); } } } /** * 抽象观察者 */ public interface Observer { void update();//得到通知后的响应方法 } /** * 具体观察者类 */ public class ConcreteObserver implements Observer { ////得到通知后的响应方法 @Override public void update() { System.out.println("ConcreteObserver update"); } //当观察者变化时,调用观察目标类的通知方法 public void change(ConcreteSubject concreteSubject){ System.out.println("自身发生变化"); concreteSubject.notifyObserver();//调用观察目标类的通知方法,以通知其他观察者 } } public class Test { public static void main(String[] args){ ConcreteObserver observer1=new ConcreteObserver(); ConcreteObserver observer2=new ConcreteObserver(); ConcreteSubject concreteSubject=new ConcreteSubject(); concreteSubject.attach(observer1); concreteSubject.attach(observer2); observer1.change(concreteSubject); } }
2、模板方法模式:
父类定义基本的方法,其中有一些是公共方法,而某些方法没有实现,而是由其子类去实现
public class AbstractClass { //子类的公有方法 public void m1(){ System.out.println("m1"); } //需要子类去实现 protected void m2(){ } } public class ConcreteClass extends AbstractClass{ public void m2(){ System.out.println("m2"); } }
3、策略模式
在策略模式中,定义一些独立的类封装不同的算法。
Context类是一个环境类,是使用算法的类,环境类中维持一个对抽象类策略的实例,用以定义所采用的策略。UML类图如下:
代码如下:
public abstract class Strategy { public abstract void algorithm(); } public class ConcreteStrategyA extends Strategy { @Override public void algorithm() { System.out.println("StrategyA execute"); } } public class ConcreteStrategyB extends Strategy { @Override public void algorithm() { System.out.println("StrategyB execute"); } } public class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void algorithm() { strategy.algorithm(); } } public class Test { public static void main(String[] args){ Context context=new Context(); context.setStrategy(new ConcreteStrategyA()); context.algorithm(); } }