觀察者模式學(xué)習(xí)
1.面向?qū)ο蟮纳档戎瓴校裁磿r(shí)候孩子醒了什么時(shí)候執(zhí)行横漏。
/**
* 面向?qū)ο蟮纳档? *
*/
class Child{
private boolean cry = false;
public boolean isCry() {
return cry;
}
public void wakeup() {
System.out.println("Wake up! Crying wuwuwuwuwu...");
cry = true;
}
}
public class App
{
public static void main( String[] args )
{
Child child = new Child();
while(!child.isCry()) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("observer ... ");
}
}
}
- 加入觀察者
class Child{
private boolean cry = false;
private Dad d = new Dad();
public boolean isCry() {
return cry;
}
public void wakeup() {
System.out.println("Wake up! Crying wuwuwuwuwu...");
d.feed();
}
}
class Dad{
public void feed() {
System.out.println("Dad feeding ... ");
}
}
public class App2 {
public static void main(String[] args) {
Child child = new Child();
child.wakeup();
}
}
從上可以看出绊茧,觀察者(Dad)被放在被觀察者(Child)里面了,然后一旦發(fā)生調(diào)用就會(huì)通知給觀察者。
3.加入多個(gè)觀察者
/**
* 加入多個(gè)觀察者
*
*/
class Child{
private boolean cry = false;
private Dad dad = new Dad();
private Mum mum = new Mum();
private Dog dog = new Dog();
①
public boolean cry() {
return cry;
}
public void wakeup(){
cry = true;
dad.feed();
dog.wang();
mum.hug();
②
}
}
class Dad{
public void feed() {
System.out.println("dad feeding ... ");
}
}
class Mum{
public void hug() {
System.out.println("mum hugging ...");
}
}
class Dog{
public void wang() {
System.out.println("dog wang ... ");
}
}
public class App3 {
public static void main(String[] args) {
Child child = new Child();
child.wakeup();
}
}
輸出:
dad feeding ...
dog wang ...
mum hugging ...
從上可以看出尊蚁,一個(gè)被觀察者可以加入多個(gè)觀察者侣夷,而每個(gè)觀察者的處理方式也可能不同。但是上面代碼的方式不是特別好百拓,如果需要添加新的觀察者進(jìn)來,則代碼中①②的位置都需要修改衙传。并且每個(gè)觀察者也不一定都是耦合到被觀察者上(即,有可能訂閱的不是被觀察者)地回,耦合度過高。
- 分離觀察者與被觀察者
import java.util.ArrayList;
import java.util.List;
/**
* 分離觀察者與被觀察者
*
*/
class Child{
private boolean cry = false;
// 定義一個(gè)列表來放置觀察者
private List<Observer> observers = new ArrayList<>();
// 也可以在配置文件中配置刻像,和初始化語句塊效果一樣
{
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
}
public boolean cry() {
return cry;
}
public void wakeup(){
cry = true;
for(Observer o: observers) {
o.actionWakeup();
}
}
}
// 任何一個(gè)觀察者都應(yīng)該實(shí)現(xiàn)這個(gè)方法
// 當(dāng)小孩子醒來后該執(zhí)行什么動(dòng)作
interface Observer{
void actionWakeup();
}
// 定義每個(gè)觀察者
class Dad implements Observer{
public void feed() {
System.out.println("dad feeding ... ");
}
@Override
public void actionWakeup() {
feed();
};
}
class Mum implements Observer{
public void hug() {
System.out.println("mum hugging ...");
}
@Override
public void actionWakeup() {
hug();
};
}
class Dog implements Observer{
public void wang() {
System.out.println("dog wang ... ");
}
@Override
public void actionWakeup() {
wang();
};
}
public class App4 {
public static void main(String[] args) {
Child child = new Child();
child.wakeup();
}
}
輸出:
dad feeding ...
mum hugging ...
dog wang ...