2016年最后一天,因公司性质,元旦继续上班,春节早一些放假,额…祝各位元旦快乐!!!
software entities should be open for extension,but closed for modefication;
一个良好的软件实体应该是对扩展开放,对修改关闭,即“开-闭”原则(Open-Closed principle),包含3种特性:可扩展性,灵活性以及可插入性,这就需要对Java各种设计模式能够灵活引用到项目中。
接下来复习一下Java的一些设计模式,今天先来看看观察者模式:
按照图谱一步一步来实现吧
step1定义被观察者接口
/**
* 定义被观察者接口
*
* @author Administrator
*
*/
public interface IObservered {
/**
* 订阅
*/
void registerObserver(IObserver observer);
/**
* 取消
*/
void unRegisterObserver(IObserver observer);
/**
* 通知所有观察者
*/
void notifObservers();
}
step2定义观察者都要实现的接口
public interface IObserver {
/**
* 接收到内容后的处理方法
* @param msg
*/
void update(String msg);
/**
* 取消订阅
* @param mSubject
*/
void unRegister(IObservered mSubject);
}
step3定义一个具体的被观察者
public class Observered implements IObservered {
private List<IObserver> observers = new ArrayList<IObserver>();
private String msg;
@Override
public void registerObserver(IObserver observer) {
// TODO Auto-generated method stub
observers.add(observer);
}
@Override
public void unRegisterObserver(IObserver observer) {
// TODO Auto-generated method stub
int index = observers.indexOf(observer);
if (index >= 0) {
observers.remove(index);
}
}
@Override
public void notifObservers() {
// TODO Auto-generated method stub
for (IObserver observer : observers) {
observer.update(msg);
}
}
/**
* 设置内容
* @param msg
*/
public void setMsg(String msg) {
this.msg = msg;
notifObservers();
}
}
step4创建观察者
public class Observer1 implements IObserver {
private IObservered mSubject;
public Observer1(IObservered mSubject) {
this.mSubject = mSubject;
mSubject.registerObserver(this);
}
public void unRegister(IObservered mSubject) {
this.mSubject = mSubject;
mSubject.unRegisterObserver(this);
}
@Override
public void update(String msg) {
// TODO Auto-generated method stub
System.out.println("Observer1 得到的消息:" + msg);
}
}
最后测试一下:
public class Test {
public static void main(String[] args) {
Observered mService = new Observered();
Observer1 mObserver1 = new Observer1(mService);
mObserver1.unRegister(mService);
Observer2 mObserver2 = new Observer2(mService);
mService.setMsg("1111");
}
}
执行结果:
Observer2 得到的消息:1111