策略模式和观察者模式


【策略模式和观察者模式】1.策略模式就是面向接口编程,定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

interface A{ int aaa(int a,int b); } class B implements A{ @Override public int aaa(int a, int b) { return a+b; } } class C implements A{@Override public int aaa(int a, int b) { return a-b; } } class Demo{ private A a; Demo(A a){ this.a=a; } public int get(int s,int t){ return a.aaa(s,t); } }public class Test {public static void main(String[] args) { Demo demo1=new Demo(new B()); System.err.println(demo1.get(5,6)); Demo demo2=new Demo(new C()); System.err.println(demo2.get(5,6)); } }

2.观察者模式。主题类实现registerObserver(),removeObserver(),notifyObservers(),通过一个list列表,观察者类实现一个update(),java有默认实现,不过在jdk9中不推荐使用
import java.util.Observable; import java.util.Observer; class Subject extends Observable{ private String s; public String getS() { return s; } public void setS(String s) { this.s = s; setChanged(); notifyObservers(); } } class ObserverA implements Observer { private Observable observable; ObserverA(Observable observable){ this.observable=observable; observable.addObserver(this); } @Override public void update(Observable o, Object arg) { if (o instanceof Subject){ Subject subject=(Subject)o; System.err.println("S改变了"); } } } public class Test1 { public static void main(String[] args){ Subject subject=new Subject(); ObserverA observerA=new ObserverA(subject); subject.setS("aaa"); subject.setS("bbb"); } }

jdk9及以后推荐使用PropertyChangeSupport和PropertyChangeListener
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeEvent; class TestBean {protected final PropertyChangeSupport support = new PropertyChangeSupport(this); private String str; public String getStr() { return str; }public void setStr(String str) { support.firePropertyChange("str", this.str, str); this.str = str; }public void addPropertyChangeListener(PropertyChangeListener listener) { support.addPropertyChangeListener(listener); }public void removePropertyChangeListener(PropertyChangeListener listener) { support.removePropertyChangeListener(listener); } }public class Test {public static void main(String[] args) {TestBean test = new TestBean(); test.addPropertyChangeListener(new PropertyChangeListener1()); test.addPropertyChangeListener(new PropertyChangeListener2()); test.setStr("ddddd"); test.setStr("yyyy"); test.setStr("yyyy"); }public static class PropertyChangeListener1 implements PropertyChangeListener{@Override public void propertyChange(PropertyChangeEvent evt) { System.out.println( "1: " + evt.getPropertyName() + "" + evt.getNewValue() + "" + evt.getOldValue()); } }public static class PropertyChangeListener2 implements PropertyChangeListener{@Override public void propertyChange(PropertyChangeEvent evt) { System.out.println( "2: " + evt.getPropertyName() + "" + evt.getNewValue() + "" + evt.getOldValue()); } } }


    推荐阅读