策略模式和观察者模式
【策略模式和观察者模式】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());
}
}
}
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福