策略模式和觀察者模式
阿新 • • 發佈:2019-01-09
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()); } } }