1. 程式人生 > >策略模式和觀察者模式

策略模式和觀察者模式

 

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());

        }
    }
}