[一次]設計モード--オブザーバーモード
/**
*
* :
* ,
* ,
*/
public class ObserverDemo01 {
public static void main(String[] args) throws InterruptedException {
MyBaby b = new MyBaby();
MyParent p1 = new MyParent(" ");
MyParent p2 = new MyParent(" ");
MyParent p3 = new MyParent(" ");
MyParent p4 = new MyParent(" ");
b.addObserver(p1);
b.addObserver(p2);
b.addObserver(p3);
b.addObserver(p4);
for(int i=0;i<5;i++){
Thread.sleep(1000);
if(b.isAwake()){
b.sleep();
}else{
b.wakeUp();
}
}
}
}
/**
*
*/
interface IMyObserver{
void update(MyObservable obs);
}
/**
*
*/
class MyObservable{
protected List<IMyObserver> list = new ArrayList<IMyObserver>();
public void addObserver(IMyObserver obs){
list.add(obs);
}
public void removeObserver(IMyObserver obs){
list.add(obs);
}
public void notifyAllObservers(){
for (IMyObserver obs : list) {
obs.update(this);
}
}
}
/**
* 、
*/
class MyBaby extends MyObservable{
private boolean isAwake = false;
public boolean isAwake(){
return this.isAwake;
}
public void wakeUp(){
System.out.println("baby ");
this.isAwake = true;
notifyAllObservers();
}
public void sleep(){
System.out.println("baby ");
this.isAwake = false;
notifyAllObservers();
}
}
class MyParent implements IMyObserver{
private String name;
public MyParent(String name){
this.name = name;
}
@Override
public void update(MyObservable obs) {
if( ((MyBaby)obs).isAwake() ){
System.out.println("["+name+"] ");
}else{
System.out.println("["+name+"] ");
}
}
}
実行結果:
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
/**
* (JDK )
*
* 1、 (baby) java.util.Observable
* ( ) setChanged() notifyObservers()
* 2、 (parent) java.util.Observer update()
* 3、 (addObserver() )
*
* / ,
* /
*
* :
* 1、 deleteObserver()
*
* 2、 ( )
* 3、
*
* :
* 、AWT、Android
*/
public class ObserverDemo02 {
public static void main(String[] args) throws InterruptedException {
Baby b = new Baby();
Parent p1 = new Parent(" ");
Parent p2 = new Parent(" ");
Parent p3 = new Parent(" ");
Parent p4 = new Parent(" ");
b.addObserver(p1);
b.addObserver(p2);
b.addObserver(p3);
b.addObserver(p4);
for(int i=0;i<5;i++){
Thread.sleep(1000);
if(b.isAwake()){
b.sleep();
}else{
b.wakeUp();
}
}
}
}
class Baby extends Observable{
private boolean isAwake = false;
public boolean isAwake(){
return this.isAwake;
}
public void wakeUp(){
System.out.println("baby ");
this.isAwake = true;
setChanged();
notifyObservers();
}
public void sleep(){
System.out.println("baby ");
this.isAwake = false;
setChanged();
notifyObservers();
}
}
class Parent implements Observer{
private String name;
public Parent(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if( ((Baby)o).isAwake() ){
System.out.println("["+name+"] ");
}else{
System.out.println("["+name+"] ");
}
}
}
実行結果(上):
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
baby
[ ]
[ ]
[ ]
[ ]
/**
* ,
*
*
*/
public class ObserverDemo03 {
public static void main(String[] args) throws InterruptedException {
String[] arr = {" "," "," "};
YiJia yijia = new YiJia(arr);
XiaoTou dnw = new XiaoTou(" ",yijia);
XiaoHu hu = new XiaoHu();
yijia.addObserver(hu);
for(int i=0;i<arr.length;i++){
dnw.tou();
Thread.sleep(1000);
}
}
}
/**
*
*/
class YiJia extends Observable{
private int initSize;
private String[] arr;
public YiJia(String[] arr){
this.arr = arr;
this.initSize = arr.length;
}
public int getInitSize(){
return initSize;
}
public void get(XiaoTou xt){
int index = arr.length-1;
String oldVal = arr[index];
System.out.println("====["+xt.name+"] ["+oldVal+"]");
xt.hold = oldVal;
String[] newArr = new String[index];
System.arraycopy(arr, 0, newArr, 0, index);
arr = newArr;
setChanged();
notifyObservers(xt);
}
}
/**
* ( )
*/
class XiaoTou{
private YiJia yijia;
String name;
String hold;
public XiaoTou(String name, YiJia yijia){
this.name = name;
this.yijia = yijia;
}
public void tou(){
yijia.get(this);
}
}
/**
*
*/
class XiaoHu implements Observer{
@Override
public void update(Observable o, Object arg) {
if(arg instanceof XiaoTou){
System.out.println(" , *"+((XiaoTou)arg).hold+"* !");
System.out.println(" ?");
System.out.println(((XiaoTou)arg).name);
}
}
}
実行結果:
====[ ] [ ]
, * * !
?
====[ ] [ ]
, * * !
?
====[ ] [ ]
, * * !
?