策略模式和观察者模式

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

        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43245707/article/details/85332265